C# 实体框架-1到。。。多对一选择
在可能的情况下,IHAC更喜欢实体框架而不是代码、现有数据库(因此更改模式是不可能的)。我正在尝试获得一个给定a id的唯一E元素列表。我对MS Entities是新手,这不是我将如何处理它(我认为这个团队正在用它们做一些复杂的事情,它们比冰上的snot慢),而是我得到的 下面是一个快速示意图: 这不是我的DB设计!不要向提问者开枪:) 下面是我要编写的SQL:C# 实体框架-1到。。。多对一选择,c#,sql,entity-framework,C#,Sql,Entity Framework,在可能的情况下,IHAC更喜欢实体框架而不是代码、现有数据库(因此更改模式是不可能的)。我正在尝试获得一个给定a id的唯一E元素列表。我对MS Entities是新手,这不是我将如何处理它(我认为这个团队正在用它们做一些复杂的事情,它们比冰上的snot慢),而是我得到的 下面是一个快速示意图: 这不是我的DB设计!不要向提问者开枪:) 下面是我要编写的SQL: SELECT E.e_Id, E.e_Name FROM A, B, C, D, E WHER
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 ???
是否所有导航属性都存在?也就是说,您可以使用
dLocal.e
导航吗?如果没有,请使用context.eenties.Where(e=>e.e_Id==dLocal.e_Id)
(可能使用Single()。将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进行了方法链转换,因此可能会更美观。您可以使用查询语法在linq中的一条语句中执行多个FROM
来自表1中的t1来自表2中的t2
等等@Silvermind,他只是对他的sql联接使用老式的SQL89格式,而不是内部联接(SQL92),没有创建笛卡尔积。@RCServer,我的答案有用吗?你还有其他问题吗?@paqogomez,是的,但是。。。他这样做,但只是通过包含where
来限制。你的例子显示了一个他确实需要的内部连接。他本可以在sql查询中这样做,但每个查询都有自己的查询。你的答案是实际的方式,但是,伙计,方法链中的连接看起来丑陋吗@paqogomez还没有:(他们创建的模型中没有关系表C,所以我无法从这里得到(我可以看到),而且是的,他们到处都使用难看的方法语法。为什么他们不在模型中包含关系表?Where在哪里?(A.A_Id='someid')
客户没有使用LINQ:(我对EF/Linq不太熟悉,但从实体模型中可以看出,关系表C不是直接表示的,而是通过导航属性间接表示的。因此,我不知道如何进行Linq查询。@r服务器如果可以在sql中进行查询,则可以在Linq中进行查询。如果C
只是链接到..例如B
您不需要执行C
连接。只需在where中为B
连接添加一个限制。和&B..C_Id==d.C_Id
@rcserver,您可能也会从中受益。它可以读取您的实体模型,然后您可以输入直接SQL并将其转换为Linq。在购买之前,请查看一些@paqogomez B.C是一个实体集合,这就是我上面的突破不起作用的原因。我几乎准备好将吸盘与db紧密耦合,并为我编写一个过程。当然,我对EF/Linq的经验不足可能是因为我没有看到它。好吧,这就是它崩溃的地方。关系是存在的,但我有很多D,我想要很多E但只有独特的(因此是group by)