【问题标题】:Linq Equivalent to Where Clause with Nested ConditionsLinq 等效于带有嵌套条件的 Where 子句
【发布时间】:2015-07-29 20:43:27
【问题描述】:

SQL 语句是这样的:

Select * From Table
Where 
Column1 = 'A' OR
(Column2 = 'A' AND
 Column3 = 'A')

因此 Column1 可能等于“A”,或者 Column2 和 Column3 的组合等于“A”将构成匹配。

我如何编写一个 linq 语句来做同样的事情?

【问题讨论】:

  • 看起来几乎一模一样。在尝试编写复杂谓词时,您尝试过做什么?尝试使用 LINQ 解决方案时遇到了什么问题?
  • @Servy Column1 可以等于 A,或者 Column2 和 Column3 TOGETHER 都需要等于 A。
  • 是的,那么您在 LINQ 中这样做有什么问题。您将通过编写多个谓词并使用括号来完成它,就像在 SQL 中一样。

标签: c# asp.net linq entity-framework


【解决方案1】:

使用IEnumerable 的 LINQ 扩展方法:

var result = collection.Where(x => x.Column1 = "A" || 
                                  (x.Column2 == "A" && x.Column3 == "A"));

如果您使用的是实体框架,您可以从您的表中获得过滤结果,如下所示:

using (var context = new MyDbContext())
{
    var result = cocontext.MyTable.Where(x => x.Column1 = "A" || 
                                             (x.Column2 == "A" && x.Column3 == "A"));    
}

【讨论】:

  • 我很欣赏使用 lambdas 比我的回答更干净。 +1
  • @Adam 这是一天结束时的偏好。我认为你的对于来自 SQL 的人来说更容易。
【解决方案2】:

如果您使用 Enity Framework 并且您有一个具有这些属性的实体,您可以使用 Linq to Entities 执行几乎相同的操作:

var query= from row in context.Table
           where row.Column1 == "A" || (row.Column2 == "A" && row.Column3 == "A")
           select row;

另外,如果您不想使用 LINQ to Entities 并且想直接执行查询,则可以使用 DbSet.SqlQuery 方法:

var result=context.Table.SqlQuery("Select * From Table Where Column1 = 'A' OR (Column2 = 'A' AND  Column3 = 'A')");

【讨论】:

  • 不幸的是,我相信这种语法不适用于实体框架。
【解决方案3】:

这与没有 AND/OR 的特定组合的情况完全一样。只需根据需要使用括号即可。

var query = from table in tables //or whatever your IEnumerable set is if you have one
where table.column1 == value || (table.column2 == value && table.column3 == value)
select table

【讨论】:

  • 这会转化为 SQL 查询吗?
  • 这是转换为 LINQ 的查询的通用格式。不能指望我在你的程序中实现这一点。
  • @Jason 如果您使用的是 EF,那么它将为您将其转换为 SQL。在这种情况下使用 LINQ to Entities。
  • 不幸的是,我相信这种语法不适用于实体框架。
  • 哦,我忘记了列上的表头。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
相关资源
最近更新 更多