【问题标题】:LINQ Join returning IQueryableLINQ Join 返回 IQueryable
【发布时间】:2017-04-02 09:34:41
【问题描述】:

我有 3 个这样的表之间的关系

我想要一个方法,给定 table1 类型的参数和 DbContext 我从 table3 中获取所有相关行,通过 table2

这是我的实现

public static IQueryable<table3> GetRows(
  EntitiesContext context, 
  table1 row)
{
  var table3Rows =
    from t2 in row.table2
    join t3 in context.table3 on t2.IdTable3 equals t3.Id
    select t3;

  return table3Rows;
}

这种方法的问题是我无法返回 table3Rows,因为它是 IEnumerable 而不是 IQueryable

在使用 join 时是否有任何解决方法可以返回 IQueryable

我需要 IQueryable 因为我计划对结果进行一些其他查询。

【问题讨论】:

标签: c# entity-framework linq


【解决方案1】:

如果您有一个已经物化的Table1 对象,您将无法使用导航属性。如果您有IQueryable&lt;Table1&gt;,那么您可以使用您正在使用的一般方法,结果自然会是IQueryable&lt;Table3&gt;

由于您有一个具体化的表行,因此您需要在数据库中查询 Table2 项目,而不是使用导航属性。

public static IQueryable<table3> GetRows(
  EntitiesContext context, 
  table1 row)
{
  var table3Rows =
    from t2 in context.table2
    where row.Table2Id == t2.Id
    from t3 in t2.Table3 //here we can use a navigation property, since it's not on a materialized object.
    select t3;

  return table3Rows;
}

【讨论】:

  • 这不会编译。
  • @TamasIonut 为什么不呢?显然我对 OP 的 schema 做了一些假设,可能需要根据他的具体名字进行调整,但前提是这里很重要,这没有缺陷。
  • 第一个“from”之后的“on”关键字
  • @TamasIonut 正确,已修复。
  • 是的,但这意味着一些变化:Table1(“row”实例)没有对table2(“Table2Id”)的引用+第二个仍然无法编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2018-10-27
  • 2011-04-08
  • 2010-10-02
  • 2017-12-29
  • 2012-10-01
相关资源
最近更新 更多