实体框架 - 1到......多对1选择

时间:2014-03-19 13:58:04

标签: c# sql entity-framework

IHAC在可能的情况下优先考虑实体框架,现有的DB(因此更改架构是不可能的)。我正在尝试获得一个给定A id的唯一E元素列表。我是MS Entities的新手,而不是我将如何处理它(我认为这个小组正在对他们做的一些复杂的事情,他们比冰上的鼻子更慢),但它是我已经被处理过的。

这是一个快速图表: db example diagram 这不是我的数据库设计!不要射击提问者:)

这是我写的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 ???

2 个答案:

答案 0 :(得分:2)

将你的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进行了方法链转换,因此它可能更漂亮。

答案 1 :(得分:0)

是否存在所有导航属性?即你可以使用dLocal.E进行导航吗?如果没有,请使用context.EEntities.Where(e => e.e_Id == dLocal.e_Id)(可能改为使用Single())。