Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-1到。。。多对一选择_C#_Sql_Entity Framework - Fatal编程技术网

C# 实体框架-1到。。。多对一选择

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

在可能的情况下,IHAC更喜欢实体框架而不是代码、现有数据库(因此更改模式是不可能的)。我正在尝试获得一个给定a id的唯一E元素列表。我对MS Entities是新手,这不是我将如何处理它(我认为这个团队正在用它们做一些复杂的事情,它们比冰上的snot慢),而是我得到的

下面是一个快速示意图: 这不是我的DB设计!不要向提问者开枪:)

下面是我要编写的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 ???

是否所有导航属性都存在?也就是说,您可以使用
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)