【问题标题】:EF Linq Multiple Inner Joins using nested subqueries使用嵌套子查询的 EF Linq 多个内连接
【发布时间】:2013-06-19 02:39:24
【问题描述】:

所以我有两个表 Site 和 Contact ,它们通过 ContactSites 表具有多对多关系。 Site 和 Contact 表都有一个名为 Deleted 的布尔属性。我正在尝试编写一个 LINQ 查询,其中列出了所有具有已删除属性 = false 并且具有相关站点的联系人也具有已删除属性 = false

这是我正在使用的代码:

from c in Contacts
where c.Deleted == false 
select new{c.LName, c.FName, SiteContactSites = 
                            (from cs in ContactSites
                            where cs.Contact_ID == c.ID
                            select new{ cs.Contact_ID,   cs.Site_ID, Sites = 
                                                                (from s in Sites 
                                                                where cs.Site_ID == s.ID &&
                                                                s.Deleted == false 
                                                                select cs).First()}).First()}

但结果似乎就像我想要的外部联接与内部联接。

我正在专门寻找一种方法来使用嵌套子查询而不是连接,这将是:

from c in Contacts
join cs in ContactSites on c.ID equals cs.Contact_ID
join s in Sites on  cs.Site_ID equals s.ID
where c.Deleted == false && s.Deleted == false
select c

感谢任何帮助

【问题讨论】:

  • 第二个 - 简单,简洁 - 代码示例是否有效?如果是这样,您为什么需要子查询?
  • 第二个代码示例在 linqpad 中编写时有效,但在 C# vs2012 中无效,因为没有 ContactSites 的模型
  • 但是第一个查询也不起作用,因为您正在加入 ContactSites。
  • 好吧,两个查询都在 linqpad 中工作,换句话说,它们返回数据..第二个返回正确的数据......你是对的,没有一个在 VS C# 中工作,因为没有用于相交的模型表...但是我该怎么做才能解决这个问题
  • 创建 ContactSite 实体,并将其添加到您正在查询的上下文中...

标签: linq entity-framework nested-queries


【解决方案1】:

所以下面的方法可以解决问题:

from c in db.Contacts
from co in c.Communities
where co.Deleted == false
select c

当您使用 LINQ to Entities 时,它全部在导航属性中,因此正在发生连接 在“来自 c.Communities 中的 co”。 我想我的困惑是我使用的是使用 LINQ to SQL 的 LinqPAD

这个链接很有帮助,让我明白了:

http://peter.hahndorf.eu/blog/post/2010/12/31/UsingLinqInManytomanySelectScenarios

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2013-07-08
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多