【问题标题】:ef core select records from tableA with matching fields in tableBef core 从表中选择具有匹配字段的记录
【发布时间】:2017-12-06 08:49:27
【问题描述】:

我正在尝试将查询从原始 sql 转换为 EF Core 2 中的 linq 语句

查询是这样的

SELECT * FROM TableA
WHERE FieldA = ConditionA
AND FieldB IN (SELECT FieldC FROM TableB WHERE FieldD = ConditionB)

FieldA 和 FieldB 来自 TableA,FieldC 和 FieldD 来自 TableB

我需要 TableA 中的所有字段,而 TableB 中没有返回任何字段,所以它应该类似于

return Context.TableA
    .Where(x => x.FieldA == ConditionA)
    .[ some code here ]
    .ToList()

我目前的解决方案是获取两个不同的结果集并将它们加入代码中,就像这样

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;

我希望它有效,我仍然需要对其进行测试,但我正在寻找更好的解决方案(如果有的话)

【问题讨论】:

    标签: entity-framework linq ef-core-2.0


    【解决方案1】:

    您可以像这样在查询中简单地使用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();
    

    【讨论】:

    • 您甚至可以避免第一个 ToList() 只向数据库服务器发出一个查询。
    【解决方案2】:

    这是一个需要应用的简单连接 -

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

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      相关资源
      最近更新 更多