LINQ Lambda在子查询中的位置

时间:2018-04-10 08:56:29

标签: sql .net linq

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

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}).....

我可以加入。最好的方法是什么?或者我有其他选择?。

我正在使用实体框架

由于

4 个答案:

答案 0 :(得分:0)

在LINQ lambda中使用子查询

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

答案 1 :(得分:0)

在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 ) );

答案 2 :(得分:0)

来自我的SQL to LINQ recipe

将SQL转换为LINQ查询理解:

  1. 将子选择转换为单独声明的变量。
  2. .Contains()转换为NOT IN!转换为Contains() ... SELECT *,使用文字数组或数组变量作为常量列表。
  3. 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; 必须替换为select range_variable或者连接,一个包含所有范围变量的匿名对象。
  4. 所以,对于你的SQL,

    data$city_mpg

答案 3 :(得分:0)

也许您需要这个:

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