【问题标题】:LINQ to SQL: subfilter in where conditionsLINQ to SQL:条件中的子过滤器
【发布时间】:2011-12-05 18:41:36
【问题描述】:

这个问题可能已经在某个地方得到了回答(如果是这样,我很想拥有链接!)。但是由于我不知道我正在尝试执行哪种类型的 linq 查询,所以我找不到任何可以帮助我的东西。

我已经有一个非常简单的查询设置来获取 DomainSequences 类型的所有记录。

var query = db.DomainSequences;

有不同类型的域序列。我想得到所有这些。但是,对于 DomainType 属性等于“AT”的记录,那么我只想返回一些“AT”记录(即,对这些记录执行 where 子句以过滤“AT”记录但仍想返回所有非“AT”记录。

更简单地说,我想获取所有 DomainSequence 记录,但是对于具有 DomainType == "AT" 的记录,只有在满足某些条件时才返回它们。

我可以通过以下方式想到一种方法:

 query.Where(x => x.DomainType != "AT" || (x.DomainType == "AT" && AT conditions....));

我认为这应该可行,但是当我必须在其他列上执行子过滤器时问题就来了,然后它很快就开始变得更加混乱和复杂。

理想情况下,我想做类似的事情

 query.Where(x => x.DomainType == "AT" || x.DomainType == "KS")
      .WhereIf(y => y.DomainType == "AT" then apply filter on those)
      .WhereIf(z => z.DomainType == "KS" then apply filter to these);

我不确定是否有办法在 LINQ 或 SQL 中执行这种类型的子过滤器(尽管我想有)。关于如何相对干净地完成此操作的任何建议?

谢谢!

【问题讨论】:

    标签: sql linq filter where


    【解决方案1】:

    这与您可能用 SQL 编写的内容并没有什么不同。事实上,如果您尝试查询表达式语法方法,您可能会发现该特定连接更容易建立。

    var query = from domain in db.DomainSequences 
                where (domain.DomainType == "AT" && domain.Foo == 42 && ...)
                    || (domain.DomainType == "KS" && domain.Foo = 117 && ...)
                select domain;
    

    这很好地映射到您可能期望编写的 SQL

    SELECT *
    FROM DomainSequences
    WHERE
        (DomainType = 'AT' AND Foo = 42 AND ...)
    OR 
        (DomainType = 'KS' AND Foo = 117 AND ...)
    

    当然,您可以使用 lambda 将其保持在流畅的扩展方法语法中,当然,毕竟这只是一个 .Where(...) 调用。

    【讨论】:

      【解决方案2】:
      query.Where(x => x.DomainType == "AT" || x.DomainType == "KS")
           .Where(y => y.DomainType != "AT" || other filter)
           .Where(z => z.DomainType != "KS" || other filter);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-21
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        相关资源
        最近更新 更多