linq where子句中的逗号分隔列

时间:2014-08-29 11:41:54

标签: asp.net-mvc-4 linq-to-entities

我有像“4,3,8”

这样的价值观

我在表格中有逗号分隔列,如下所示。



    ID   |  PrdID   |  cntrlIDs 
    1    |   1      |   4,8
    2    |   2      |   3
    3    |   3      |   3,4
    4    |   4      |   5,6
    5    |   5      |   10,14,18

我只希望上表中与上述字符串匹配的那些记录

例如。 1,2,3这条记录在输出时需要,因为它与传递的字符串“4,3,8”匹配

注意:我需要在实体框架LINQ Query中使用它。

string[] arrSearchFilter = "4,3,8".Split(',');
var query = (from prdtbl in ProductTables 
where prdtbl.cntrlIDs.Split(',').Any(x=> arrSearchFilter.Contains(x))

但它不起作用,我得到了以下错误

  

LINQ to Entities无法识别方法'System.String [] Split(Char [])'方法,而且此方法无法转换为商店表达式。

1 个答案:

答案 0 :(得分:1)

LINQ to Entities尝试将查询表达式转换为SQL。 String.Split不是受支持的方法之一。见http://msdn.microsoft.com/en-us/library/vstudio/bb738534(v=vs.100).aspx

假设您无法重新设计数据库结构,则必须绕过SQL过滤器并获取所有记录,然后应用过滤器。您可以使用ProductTables.ToList()执行此操作,然后在第二个查询中使用此字符串拆分,例如

string[] arrSearchFilter = "4,3,8".Split(',');
var products = ProductTables.ToList();
var query = (from prdtbl in products 
where prdtbl.cntrlIDs.Split(',').Any(x=> arrSearchFilter.Contains(x))

如果Product表很大,这不是一个好主意,因为您正在失去SQL的主要优点并在过滤之前加载所有数据。

重新设计

如果这是一个问题,并且您可以更改数据库结构,则应创建一个子表,用可用规范化结构替换逗号分隔值。逗号分隔的变量可能看起来像一个方便的快捷方式,但它们不是一个好的设计,正如您所发现的那样,在SQL中使用起来并不容易。

SQL

如果设计无法更改且表格很大,那么您唯一的另一个选择是手动滚动SQL并直接执行此操作,但这会失去Linq的一些好处。