LINQ to SQL查询帮助(字符串包含字符串数组中的任何字符串)
我一直在用这个撕掉我的头发。 我有一系列搜索术语,我正在尝试使用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;
……但后来了
除Contains()运算符外,本地序列不能用于查询运算符的LINQ to SQL实现
……现在我被卡住了。
如果有人能帮忙,我会非常感激。 提前致谢。
抢
我不确定这是否是最简单的解决方案,但这将有效:
var filter = CreateFilter(staffTermArray); var searchResults = from person in SDC.Staff_Persons.Where(filter) orderby person.Surname select person; private static Expression> CreateFilter( string[] staffTermArray) { var predicate = PredicateBuilder.False(); 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来实现此目的。
一种选择是在客户端而不是在SQL中进行过滤。 您可以通过调用AsEnumerable()
来强制在客户端上评估的where
。 但是,这意味着在测试匹配之前,表的每一行都会加载到内存中,因此如果搜索只匹配大表中的少量结果,则可能效率低得令人无法接受。
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;