Entity framework ef core从表A中选择记录,并在表B中选择匹配字段

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 =

我正在尝试将查询从原始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 = 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服务器发出一个查询。