C# 如何编写Linq';或';通过迭代字符串搜索参数集合进行查询
我有一个基于字符串的搜索参数列表: i、 e.{“partialName1”、“partialName2”、“partialName3”、“partialName3”、“partialName(N)”} 我永远都不知道N码是多少 我想通过迭代这个字符串集合来组合一个Linq(Linq to Entities)“或”查询,并组合一个与下面的查询等价的查询:C# 如何编写Linq';或';通过迭代字符串搜索参数集合进行查询,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,我有一个基于字符串的搜索参数列表: i、 e.{“partialName1”、“partialName2”、“partialName3”、“partialName3”、“partialName(N)”} 我永远都不知道N码是多少 我想通过迭代这个字符串集合来组合一个Linq(Linq to Entities)“或”查询,并组合一个与下面的查询等价的查询: var specialFolk = people.Where(p => p.Name.Contains("partialName1")
var specialFolk = people.Where(p => p.Name.Contains("partialName1") || p.Name.Contains("partialName2") || p.Name.Contains("partialName3") || ... || p.Name.Contains("partialName(N)"));
下面的代码演示了我要做的事情。但它不会起作用,它只是一个概念的说明,我想用它以一种可组合的方式构建一个OR查询
List<string> searchPhrases = searchPhraseGiveToUsFromAbove;
IQueryable<Person> personQuery;
foreach(string searchPhrase in searchPhrases)
{
personQuery = personQuery.Where(p=>p.Name.Contains(searchPhrase))
}
List searchPhrases=searchphraseGiveTousfromUpper;
可查询的个人查询;
foreach(搜索短语中的字符串搜索短语)
{
personQuery=personQuery.Where(p=>p.Name.Contains(searchPhrase))
}
有没有办法做到这一点?你应该用相反的方式进行比较,比如:
var query = personQuery.Where(p => searchPhrases.Any(r=> p.Name.Contains(r));
您应该以相反的方式进行比较,如:
var query = personQuery.Where(p => searchPhrases.Any(r=> p.Name.Contains(r));
感谢@GertArnold,我通过他关于谓词生成器的评论找到了我的方法 关于“c#linq通过谓词生成器组合查询”的快速bing 我在LINQKit中找到了一个“linq”: 现在我知道SO不喜欢链接作为答案,但我不确定我是否会剽窃(关于这方面的一些建议会很有用) 谓词生成器非常酷,可以通过编程轻松地组合查询(复制自albahari): 然而,我想把这些谓词链接成更复杂的东西,我被一个错误难住了: 参数“f”未绑定在指定的LINQ to Entities查询表达式中 这让我找到了一个名为a的博客 正如Pete解释的那样,由于依赖于调用表达式,Albahari版本不能很好地使用实体框架。如果你正在使用EF,Pete关于这方面的博客非常值得一读 我也不想仅仅复制和粘贴他的解决方案(这是他的,他提供免费),但我将展示我能够构建的查询,最终解决了我的问题:
private IQueryable<Show> BuildQueryForLibrarySearchTerms(IEnumerable<LibraryShowSearchTerm> searchTerms)
{
IQueryable<Show> query = _repository.Get();
IEnumerable<LibraryShowSearchTerm> includeTerms = searchTerms.Where(st=>st.Exclude.Equals(false));
IEnumerable<LibraryShowSearchTerm> excludeTerms = searchTerms.Where(st=>st.Exclude.Equals(true));
var predicate = LinqPredicateBuilder.False<Show>();
var includePredicate = LinqPredicateBuilder.False<Show>();
foreach (LibraryShowSearchTerm searchTerm in includeTerms)
{
string temp = searchTerm.SearchTerm;
includePredicate = includePredicate.Or(show => show.ShowTitle.Contains(temp));
}
var excludePredicate = LinqPredicateBuilder.True<Show>();
foreach (LibraryShowSearchTerm searchTerm in excludeTerms)
{
string temp = searchTerm.SearchTerm;
excludePredicate = excludePredicate.And(show => !show.ShowTitle.Contains(temp));
}
predicate = includePredicate.And(excludePredicate);
return query.Where(predicate);
}
private IQueryable BuildQueryForLibrarySearchTerms(IEnumerable searchTerms)
{
IQueryable查询=_repository.Get();
IEnumerable includeTerms=searchTerms.Where(st=>st.Exclude.Equals(false));
IEnumerable excludeTerms=searchTerms.Where(st=>st.Exclude.Equals(true));
var谓词=LinqPredicateBuilder.False();
var includePredicate=LinqPredicateBuilder.False();
foreach(图书馆在IncludeTerm中显示搜索术语搜索术语)
{
字符串温度=searchTerm.searchTerm;
includePredicate=includePredicate.Or(show=>show.showtTitle.Contains(temp));
}
var excludedpredicate=LinqPredicateBuilder.True();
foreach(LibraryShowSearchTerm搜索术语,不包括术语)
{
字符串温度=searchTerm.searchTerm;
excludePredicate=excludePredicate.And(show=>!show.ShowTitle.Contains(temp));
}
谓词=includePredicate.And(excludePredicate);
返回query.Where(谓词);
}
虽然我已经给出了这个答案,它是。我没有这样做,因为这不是我要给出的答案,如果Pete或Joseph(Albahari)遇到这个问题并希望创建一个答案,我会这样做。谢谢@GertArnold,我通过他关于谓词生成器的评论找到了我的方法 关于“c#linq通过谓词生成器组合查询”的快速bing 我在LINQKit中找到了一个“linq”: 现在我知道SO不喜欢链接作为答案,但我不确定我是否会剽窃(关于这方面的一些建议会很有用) 谓词生成器非常酷,可以通过编程轻松地组合查询(复制自albahari): 然而,我想把这些谓词链接成更复杂的东西,我被一个错误难住了: 参数“f”未绑定在指定的LINQ to Entities查询表达式中 这让我找到了一个名为a的博客 正如Pete解释的那样,由于依赖于调用表达式,Albahari版本不能很好地使用实体框架。如果你正在使用EF,Pete关于这方面的博客非常值得一读 同样,我不想只是复制和粘贴他的解决方案(这是他的,他免费提供),但我将展示我能够构建的查询,它最终解决了我的问题:
private IQueryable<Show> BuildQueryForLibrarySearchTerms(IEnumerable<LibraryShowSearchTerm> searchTerms)
{
IQueryable<Show> query = _repository.Get();
IEnumerable<LibraryShowSearchTerm> includeTerms = searchTerms.Where(st=>st.Exclude.Equals(false));
IEnumerable<LibraryShowSearchTerm> excludeTerms = searchTerms.Where(st=>st.Exclude.Equals(true));
var predicate = LinqPredicateBuilder.False<Show>();
var includePredicate = LinqPredicateBuilder.False<Show>();
foreach (LibraryShowSearchTerm searchTerm in includeTerms)
{
string temp = searchTerm.SearchTerm;
includePredicate = includePredicate.Or(show => show.ShowTitle.Contains(temp));
}
var excludePredicate = LinqPredicateBuilder.True<Show>();
foreach (LibraryShowSearchTerm searchTerm in excludeTerms)
{
string temp = searchTerm.SearchTerm;
excludePredicate = excludePredicate.And(show => !show.ShowTitle.Contains(temp));
}
predicate = includePredicate.And(excludePredicate);
return query.Where(predicate);
}
private IQueryable BuildQueryForLibrarySearchTerms(IEnumerable searchTerms)
{
IQueryable查询=_repository.Get();
IEnumerable includeTerms=searchTerms.Where(st=>st.Exclude.Equals(false));
IEnumerable excludeTerms=searchTerms.Where(st=>st.Exclude.Equals(true));
var谓词=LinqPredicateBuilder.False();
var includePredicate=LinqPredicateBuilder.False();
foreach(图书馆在IncludeTerm中显示搜索术语搜索术语)
{
字符串温度=searchTerm.searchTerm;
includePredicate=includePredicate.Or(show=>show.showtTitle.Contains(temp));
}
var excludedpredicate=LinqPredicateBuilder.True();
foreach(LibraryShowSearchTerm搜索术语,不包括术语)
{
字符串温度=searchTerm.searchTerm;
excludePredicate=excludePredicate.And(show=>!show.ShowTitle.Contains(temp));
}
谓词=includePredicate.And(excludePredicate);
返回query.Where(谓词);
}
虽然我已经给出了这个答案,它是。我不会这样做,因为这不是我要给出的答案,如果皮特或约瑟夫(Albahari)遇到这个问题并希望创建一个答案,我会这样做。在LINQ to objects中,这将非常好。在LINQ to Entities中,
Any
创建一个SQL短语,该短语快速超过最大嵌套级别。s中数十个元素的Ac耦合