我一直在用这个撕掉我的头发。我有一系列搜索术语,我正在尝试LINQ to SQL查询来搜索数组中每个项目的字段值。
我到目前为止......
var searchResults =
from x in SDC.Staff_Persons
where staffTermArray.Any(pinq => x.Forename.Contains(pinq))
|| staffTermArray.Any(pinq => x.Surname.Contains(pinq))
|| staffTermArray.Any(pinq => x.Known_as.Contains(pinq))
orderby x.Surname
select x;
......但后来
本地序列不能在LINQ中使用 到SQL的查询实现 除Contains()之外的运算符 操作
......现在我被卡住了。
如果有人可以提供帮助,我会非常感激。 提前谢谢。
罗布
答案 0 :(得分:6)
我不确定这是否是最简单的解决方案,但这可行:
var filter = CreateFilter(staffTermArray);
var searchResults =
from person in SDC.Staff_Persons.Where(filter)
orderby person.Surname
select person;
private static Expression<Func<Staff_Person, bool>> CreateFilter(
string[] staffTermArray)
{
var predicate = PredicateBuilder.False<Staff_Person>();
foreach (var staffTerm in staffTermArray)
{
// We need to make a local copy because of C# weirdness.
var ping = staffTerm;
predicate = predicate.Or(p => p.Forename.Contains(ping));
predicate = predicate.Or(p => p.Surname.Contains(ping));
predicate = predicate.Or(p => p.Known_as.Contains(ping));
}
return predicate;
}
您需要PredicateBuilder才能生效。
答案 1 :(得分:-1)
一种选择是在客户端而不是在SQL中进行过滤。您可以通过调用where
强制在客户端上评估AsEnumerable()
。但是,这意味着在测试匹配之前,表的每一行都会加载到内存中,因此如果搜索只匹配大表中的少量结果,那么它可能会无法接受。
var allPersons =
from x in SDC.Staff_Persons
orderby x.Surname
select x;
var searchResults =
from x in allPersons.AsEnumerable()
where staffTermArray.Any(pinq => x.Forename.Contains(pinq))
|| staffTermArray.Any(pinq => x.Surname.Contains(pinq))
|| staffTermArray.Any(pinq => x.Known_as.Contains(pinq))
select x;