2012-07-30 64 views
3

我试图创建一个搜索方法,我想检查关键字是否包含在给定记录的任意数量的不同列中。在LINQ中加入列并运行包含运算符

我的LINQ的声明如下:

string[] searchFilter = {"john", "iceberg"}; 


var q = from qua in qual 
        join del in deliverables on qua.ID equals del.Q_ID 
        where searchFilter.All(s => (qua.Name + " " + qua.Project + " " + qua.Summary + " " + del.Name + " " + del.Summary).ToLower().Contains(s)) 
        select qua; 

我却得到其中指出的错误信息:“本地序列不能在LINQ可以用于除载有()操作执行SQL查询操作的。 “

+0

那么,什么是问题?这个例外很自我解释 - 你有一个本地序列(阅读:内存中),并且你不能在带有L2S的linq查询中使用它,除非你将它与Contains() - 运算符一起使用。您正在使用全运算符,因此您不能在查询中使用本地序列。 – Maarten 2012-07-30 13:46:25

+0

你可能会提出一个解决上述问题的方法吗?谢谢。 – stats101 2012-07-30 13:54:24

回答

0

的包含方法,无论出于何种原因,在第二次通过循环时都没有使用过滤结果。最终奏效的方法是:

var SearchColumn = from qua in Qual 
       join del in deliverables on qua.Q_ID equals del.Q_ID into left_j 
          from del in left_j.DefaultIfEmpty() 
          select new { qua.Name + " " + qua.Project + " " + qua.Summary + " " + del.Name + " " + del.Summary).ToLower() }; 

foreach (var f in searchFilter) 
{ 
    var likestr = string.Format("%{0}%", f); 
    SearchColumn = SearchColumn.Where(x => SqlMethods.Like(x.Search_Col, likestr)); 
} 
1

你的确不能使用所有的方法,但只包含方法:

var q = from qua in qual 
     join del in deliverables on qua.ID equals del.Q_ID 
     where searchFilter.Contains(qua.Name) || searchFilter.Contains(qua.Project)... 
     select qua; 

当然你也可以用表达式动态结合您的LINQ查询(但它可能是更多的工作),或使用动态LINQ。

+0

这不会产生相同的结果。对于Name ='johnx'的记录,您的查询不会返回结果,但是来自OP的查询将会(或者那是意图)。如果序列中的所有项目都适用,那么.All运算符将仅返回,这是Contains不能执行的操作。 – Maarten 2012-07-30 13:51:18

1

不要以为你有选择:

但是当你在一个“可查询”世界留下来,这会产生只有一个SQL请求(丑陋的,但是......)

var q = from qua in qual 
     join del in deliverables on qua.ID equals del.Q_ID 
     select new{ qua, del}; 

foreach (var filter in searchFilter) 
    q = q.Where(v => (v.qua.Name + " " + v.qua.Project + " " + v.qua.Summary + " " + v.del.Name + " " + v.del.Summary).ToLower().Contains(filter)); 

var result = q.Select(p => p.qua); 
+0

与Amiram答案类似,这不会返回匹配数组内所有项目的结果。 – stats101 2012-07-30 15:50:56

+0

@ stats101哦,是的,它会。 – 2012-07-30 15:55:32

+0

只是试了一下。奇怪的是,当它第二次出现在循环中时,它不会使用第一次传递的过滤结果,而是使用原始结果。 :S – stats101 2012-07-30 17:02:01