【问题标题】:LINQ Lambda where in subqueryLINQ Lambda 在子查询中的位置
【发布时间】:2018-04-10 08:56:28
【问题描述】:

我正在尝试做这样的事情:

Select * from A where id in (Select id_a from B)

但在 LINQ 中

db.A().Join(db.B(), a => a.id, b => b.id_a, (a , b) => new { a, b}).....

我可以加入。是最好的方法吗?还是我有其他选择?。

我正在使用实体框架

谢谢

【问题讨论】:

标签: sql .net linq


【解决方案1】:

来自我的SQL to LINQ recipe

用于将 SQL 转换为 LINQ 查询理解:

  1. 将子选择转换为单独声明的变量。
  2. IN 转换为.Contains()NOT IN 转换为!...Contains(),对常量列表使用文字数组或数组变量。
  3. SELECT * 必须替换为 select range_variable 或对于连接,一个包含所有范围变量的匿名对象。

所以,对于您的 SQL,

var id_aInB = from b in db.B select b.id_a;
var ans = from a in db.A where id_aInB.Contains(a.id) select a;

【讨论】:

    【解决方案2】:

    在 LINQ lambda 中使用子查询

    var q = db.A.Where(a=> db.B.Select(b=>b.id_a).toList().Contains(a.Id)).Select(a=>a);
    

    【讨论】:

    • 在使用 LINQ to SQL 时不要使用ToList。不要做没用的Select(a => a)
    【解决方案3】:

    在 Linq 中有很多方法可以表达这一点。该 SQL 也可以用不同的方式表示,最好的方法可能是使用 EXISTS 查询,例如:

    Select * from A 
    where EXISTS (Select * from B where A.id = B.id_a)
    

    在 Linq 中可以写成:

    db.A.Where( a => db.B.Any( b => a.Id == b.Id_a ) );
    

    【讨论】:

      【解决方案4】:

      也许你需要这个:

      var result=db.A.Select(c=>new {c,listId=db.B.Select(s=>s.id_a)}).Where(w=>w.listId.Contains( w.c.id)).Select(c=>c.c);
      

      或者你可以像这样使用 LINQ

      from a in db.A
      let listId = from b in db.B
      select b.id_a
      where listId.Contains(a.id)
      select a
      

      顺便用LINQPad,你可以通过LINQ搜索得到正确的lamda

      【讨论】:

        猜你喜欢
        • 2020-02-20
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多