【问题标题】:Building a dynamic where clause for dynamic keywords or using IQueryable C# Linq为动态关键字构建动态 where 子句或使用 IQueryable C# Linq
【发布时间】:2015-07-01 18:37:30
【问题描述】:

我正在尝试使用 LINQ 编写一个动态 where 子句,以返回包含字符串数组中提供的任何关键字的所有行。到目前为止,结果并没有像我预期的那样返回,查看 SQL 我可以看到问题。

IQueryable<comments> query = _db.comments;

if (score != null)
    query = query.Where(x => x.score == score);
if (dateFrom != null)3
    query = query.Where(x => x.date_created >= dateFrom);
if (dateTo != null)
    query = query.Where(x => x.date_created <= dateTo);
if (keywords != null)
{
    //how to use OR for each in array?
    foreach (var keyword in keywords)
    {
        var keywordCondition = keyword;
        query = query.Where(x => x.text.Contains(keywordCondition));  
    }

}

WHERE ([Extent1].[score] = @p__linq__0) 
AND ([Extent1].[date_created] >= @p__linq__1) 
AND ([Extent1].[date_created] <= @p__linq__2) 
AND ([Extent1].[text] LIKE @p__linq__3 ESCAPE '~') 
AND ([Extent1].[text] LIKE @p__linq__4 ESCAPE '~')

--应该是

WHERE ([Extent1].[score] = @p__linq__0) 
AND ([Extent1].[date_created] >= @p__linq__1) 
AND ([Extent1].[date_created] <= @p__linq__2) 
AND (([Extent1].[text] LIKE @p__linq__3 ESCAPE '~') 
    OR ([Extent1].[text] LIKE @p__linq__4 ESCAPE '~'))

我希望有人可以帮助我,因为我已经花了几个小时寻找解决方案。

提前致谢

【问题讨论】:

标签: c# linq entity-framework iqueryable


【解决方案1】:

正如您所猜测的,这是您需要更改问题的部分,因为它将“与”所有子句。

//how to use OR for each in array?
foreach (var keyword in keywords)
{
    var keywordCondition = keyword;
    query = query.Where(x => x.text.Contains(keywordCondition));  
}

我认为您可以通过将其更改为:

query = query.Where(x => keywords.Any(kw => x.text.Contains(kw));

【讨论】:

    【解决方案2】:

    不知道有没有更干净的方法,但是改一下

    foreach (var keyword in keywords)
        {
            var keywordCondition = keyword;
            query = query.Where(x => x.text.Contains(keywordCondition));  
        }
    

    query = query.Where(x => keywords.Any(k => x.text.Contains(k)); 
    

    如果x.text 包含列表中的任何关键字,Any() 将返回一个布尔值

    【讨论】:

      【解决方案3】:

      如果您尝试动态构建谓词(条件),我发现的最简单和最灵活的方法是使用 PredicateBuilder。

      http://www.albahari.com/nutshell/predicatebuilder.aspx

      它让您可以完全控制是使用and 还是or 来构建查询。

      【讨论】:

        【解决方案4】:

        你真的应该研究一下动态 LINQ 查询(这里解释得很好 - http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library

        您可以像下面这样指定您的查询 -

        .Where("Column1 = value1 OR Column2 = value2");
        

        【讨论】:

        • 虽然我喜欢并使用过动态 LINQ,但我认为这里没有必要或不合适。他们只需要一个Any 子句而不是循环。
        • 这不会对 SQL 注入造成威胁吗??
        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多