IHAC在可能的情况下优先考虑实体框架,现有的DB(因此更改架构是不可能的)。我正在尝试获得一个给定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 ???
答案 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())。