【问题标题】:Linq Intersect Comma Delimited String with List Containing Strings using IqueriableLinq 使用 Iqueryable 将逗号分隔的字符串与包含字符串的列表相交
【发布时间】:2016-02-10 18:22:46
【问题描述】:

resultList is an IQueriable<foo> 用作具有过滤选项的网格的结果。这些过滤器之一是项目过滤器。

foo.projects 是一个字符串,它是由以逗号分隔的项目组成的字符串 示例:

foo.projects = "project1,project2,project3";

filterProjects 是List<string>

使用此代码过滤成功,但因为我使用的是 ToList(),resultList 不能再作为 IQueriable 用于分页目的

resultList = resultList.Where(x => (x.projects.Split(',').ToList().Intersect(filterProjects).Count() > 0)); 

我的问题是:可以在将 resultList 保持为IQueriable(不使用ToList())的同时做到这一点吗?

【问题讨论】:

  • 答案可能取决于隐藏在您不透明的IQueryable<T> 后面的提供商。你在使用实体框架吗? LINQ 到 SQL?其他数据源?
  • 我很困惑 - 您的查询仍将返回 IQueryable,但该条件可能无法按原样转换为 SQL。是什么让您认为您没有收到IQueryable 回复?
  • 加上ToList 应该是不必要的——Split 将返回一个实现IEnumerable<string>string[],所以你仍然可以在它上面调用Intersect
  • 你是对的。仍然,我的查询不起作用:(附加信息:LINQ to Entities 无法识别方法 'System.String[] Split(Char[])' 方法,并且此方法无法转换为存储表达式。

标签: c# linq asp.net-mvc-4


【解决方案1】:

试试这个

resultList.Where(x => x.Projects.Split(',').Any(p => filterProjects.Any(fp => fp == p)))

更新

正如 Mihai Labo 所指出的,这不适用于 LINQ to Entities,因为 Split() 无法转换为存储表达式。

假设过滤器名称不包含在彼此中(请参阅注释),则可以将解决方案重新设计(以在 LINQ to Entities 上工作)

resultList.Where(x => filterProjects.Any(fp => x.Projects.Contains(fp)))

【讨论】:

  • 附加信息:LINQ to Entities 无法识别方法 'System.String[] Split(Char[])' 方法,并且此方法无法转换为存储表达式。
  • 如果您可以假设过滤器名称不包含在彼此中,例如“project1”和“project2”很好,但应该没有“project1”和“project”不同过滤器,那么你不需要Split(),你可以说x.projects(作为一个字符串)应该在filterProjects中至少包含一个元素。这个条件将被修改为 resultList.Where(x => filterProjects.Any(fp => x.Projects.Contains(fp)))
  • 这正是我想要的。您能否将其添加为答案?
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2013-09-30
  • 2016-05-28
相关资源
最近更新 更多