Entity framework ef core从表A中选择记录,并在表B中选择匹配字段
我正在尝试将查询从原始sql转换为EF Core 2中的linq语句 查询是这样的Entity framework ef core从表A中选择记录,并在表B中选择匹配字段,entity-framework,linq,ef-core-2.0,Entity Framework,Linq,Ef Core 2.0,我正在尝试将查询从原始sql转换为EF Core 2中的linq语句 查询是这样的 SELECT * FROM TableA WHERE FieldA = ConditionA AND FieldB IN (SELECT FieldC FROM TableB WHERE FieldD = ConditionB) var listA = Context.TableA .Where(x => x.FieldA == ConditionA).ToList(); var listB =
SELECT * FROM TableA
WHERE FieldA = ConditionA
AND FieldB IN (SELECT FieldC FROM TableB WHERE FieldD = ConditionB)
var listA = Context.TableA
.Where(x => x.FieldA == ConditionA).ToList();
var listB = Context.TableB
.Where(x => x.FieldD == ConditionB).Select(x => x.FieldC).ToList();
listA.RemoveAll(x => !listB.Contains(x.FieldB);
return listA;
FieldA和FieldB来自表A,FieldC和FieldD来自表B
我需要返回TableA中的所有字段,而TableB中的任何字段都没有,所以应该是
return Context.TableA
.Where(x => x.FieldA == ConditionA)
.[ some code here ]
.ToList()
我目前的解决方案是获得两个不同的结果集,并将它们连接到代码中,类似这样
SELECT * FROM TableA
WHERE FieldA = ConditionA
AND FieldB IN (SELECT FieldC FROM TableB WHERE FieldD = ConditionB)
var listA = Context.TableA
.Where(x => x.FieldA == ConditionA).ToList();
var listB = Context.TableB
.Where(x => x.FieldD == ConditionB).Select(x => x.FieldC).ToList();
listA.RemoveAll(x => !listB.Contains(x.FieldB);
return listA;
我希望它能工作,我仍然需要对它进行测试,但我正在寻找更好的解决方案(如果有)您只需在查询中使用
Contains
函数,如下所示:
var ids = Context.TableB
.Where(p => p.FieldD == conditionD)
.Select(p => p.FieldC);
var result = Context.TableA
.Where(p => ids.Contains(p.FieldB))
.ToList();
这是一个需要应用的简单连接-
var result = (from a in Context.TableA.Where(x => x.FieldA == ConditionA )
join b in Context.TableB.Where(x => x.FieldD == ConditionB) on a.FieldB equals b.FieldC
select new {a}
).ToList();
您甚至可以避免第一个
ToList()
只向db服务器发出一个查询。