Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写Linq';或';通过迭代字符串搜索参数集合进行查询_C#_Linq_Linq To Entities - Fatal编程技术网

C# 如何编写Linq';或';通过迭代字符串搜索参数集合进行查询

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")

我有一个基于字符串的搜索参数列表:

i、 e.{“partialName1”、“partialName2”、“partialName3”、“partialName3”、“partialName(N)”} 我永远都不知道N码是多少

我想通过迭代这个字符串集合来组合一个Linq(Linq to Entities)“或”查询,并组合一个与下面的查询等价的查询:

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耦合