【问题标题】:Entity Framework - 1 to ... to many to 1 select实体框架 - 1 到 ... 到多对 1 选择
【发布时间】:2014-03-20 00:42:57
【问题描述】:

IHAC 在可能的情况下更喜欢实体框架而不是代码,现有数据库(因此更改架构是不可能的)。我正在尝试获取给定 A id 的唯一 E 元素列表。我是 MS Entities 的新手,这不是我处理它的方式(我认为对于这个小组与他们一起做的一些复杂的事情,它们比冰上的鼻涕要慢)但它是我得到的。

这是一个快速图表: 这不是我的数据库设计!不要向提问者开枪:)

这是我要编写的 SQL:

SELECT E.e_Id, E.e_Name
FROM
    A,
    B,
    C,
    D,
    E
WHERE
    A.a_Id = 'someid'
    AND A.a_Id = B.a_Id
    AND B.b_Id = C.b_Id 
    AND C.d_Id = D.d_Id
    AND D.e_Id = E.e_Id
GROUP BY E.e_Id, E.e_Name

逐步,我可以到达表 D 实体,但我不知道如何到达 E 实体:

        var bLocal = context.AEntities
            .Where( a => a.a_Id == 'someid' )
            .Select( b => b.B );

        var dLocal = bLocal
            .SelectMany( b => b.D );

        var eLocal = dLocal. ????
               - OR? - 
        var eLocal = context.EEntities ???

【问题讨论】:

  • 您可以使用查询语法在 linq 的一个语句中执行多个 froms。 from t1 in table1 from t2 in table2
  • @Silvermind,他只是对他的 sql 连接使用旧式 SQL89 格式而不是内部连接 ​​(SQL92),而不是创建笛卡尔积。
  • @rcarver,我的回答有效吗?您还有其他问题吗?
  • @paqogomez,是的,但是......他正在这样做,但仅通过包含 where 来限制。您的示例显示了他完全需要的内部连接。他本可以在 sql 查询中做到这一点,但对每个人来说都是他自己的。您的答案是实际可行的方法,但是伙计,加入方法链看起来很难看。 ;)
  • @paqogomez 还没有 :( 他们创建的模型中没有关系表 C,所以我无法从这里到达那里(我可以看到)是的,他们使用到处都是丑陋的方法语法。为什么它们不在模型中包含关系表?

标签: c# sql entity-framework


【解决方案1】:

将您的 sql 转换为 linq 非常简单:

var results = (from a in A
               join b in B on a.a_Id equals b.a_Id
               join c in C on b.b_Id equals c.b_Id 
               join d in D on c.d_Id equals d.d_Id
               join e in E on d.e_Id = e.e_Id
               where a.a_Id == 'someid'
               group e by new { e.e_Id, e.e_Name }
               select e)

如果你想做一个方法链,它看起来像这样:

var results = (A.Join(B, a => a.a_Id, b => b.a_Id, (a, b) => new {a, b})
    .Join(C, @t => b.b_Id, c => c.b_Id, (@t, c) => new {@t, c})
    .Join(D, @t => c.d_Id, d => d.d_Id, (@t, d) => new {@t, d})
    .Join(E, @t => d.e_Id = e.e_Id, e => , (@t, e) => new {@t, e})
    .Where(@t => a.a_Id == 1)
    .GroupBy(@t => new {e.e_Id, e.e_Name}, @t => e)
           select e)

就个人而言.. 我会坚持使用查询语法。完全披露,ReSharper 做了方法链转换,所以它可能更漂亮。

【讨论】:

  • 哪里是哪里? (A.a_Id == 'someid')
  • 客户没有使用 LINQ :( 我对 EF/Linq 不是很熟悉,但从我在实体模型中看到的关系表 C 没有直接表示,它是间接表示的通过导航属性。所以我看不到如何执行此 LINQ 查询。
  • @rcarver 如果可以在 sql 中进行,则可以在 linq 中进行。如果C 只是链接到......说B 你不需要做C 加入。只需在 where 中对 B 加入限制即可。 && b.<C Property Name>.c_Id == d.c_Id
  • @rcarver 您可能还会从Linqer 中受益。它可以读取您的实体模型,然后您可以直接输入 SQL 并将其转换为 Linq。在你购买之前,请查看these answers
  • @paqogomez b.C 是一个 EntityCollection,这就是我上面的突破不起作用的原因。我几乎准备好将吸盘与数据库紧密耦合并编写一个 proc 来为我做这件事。当然,我对 EF/Linq 缺乏经验可能是因为我没有看到它。
【解决方案2】:

所有导航属性都存在吗? IE。你能用dLocal.E导航吗?如果没有,请使用context.EEntities.Where(e => e.e_Id == dLocal.e_Id)(可能使用 Single() 代替)。

【讨论】:

  • 好吧,这就是它崩溃的地方。关系就在那里,但我有很多 D,我想要很多 E,但只想要独特的(因此分组)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多