实体框架中的多个连接并包括所有数据

时间:2010-12-10 10:29:03

标签: asp.net linq entity-framework umbraco

我想在Entity Framework中编写一个具有多个连接的查询。唯一的问题是表格与主键/外键(Umbraco数据库)无关,因此我不能使用.Include和导航属性。

基本上我想要运行的查询是:

select t.*, n.* from cmsContentType t
inner join cmsContentTypeAllowedContentType a on t.nodeId = a.Id
inner join vicinity.DocumentTypeExtendedProperty x on x.UmbracoDocumentTypeId = t.pk
inner join umbracoNode n on n.id = t.nodeId

我有两个EF实体映射到cmsContentType和umbracoNode,因此我希望它们被填充,好像我在运行查询一样

var q = from p in cmsContentType.Include("umbracoNode")

如何做到这一点

4 个答案:

答案 0 :(得分:2)

以上答案都是正确的。

但是,为了简化事情 - 为什么不创建视图?

视图可以执行您想要的连接,然后您的LINQ查询变得像饼一样简单:

var q = from x in objectContext.myFunkySpecialView
        select x;

答案 1 :(得分:1)

尝试以下方法:

var q = from t in objectContext.cmsContentType  
        from a in objectContext.cmsContentTypeAllowedContentType  
        from x in objectContext.DocumentTypeExtendedProperty  
        from n in objectContext.umbracoNode  
        where t.nodeId == a.Id && x.UmbracoDocumentTypeId == t.pk && n.id == t.nodeId  
        select new {  
          t = t,  
          n = n  
        };  

希望这有帮助。

答案 2 :(得分:1)

Include将导航属性转换为外连接。在您的SQL示例中,您实际上使用的内部联接很容易转换为LINQ。 Devart发布的LINQ查询绝对正确,但是使用join关键字而不是嵌套from语句IMHO生成的查询看起来几乎与原始SQL查询相同。

var q = from t in objectContext.cmsContentType  
        join a in objectContext.cmsContentTypeAllowedContentType on t.nodeId equals a.Id
        join x in objectContext.DocumentTypeExtendedProperty on t.pk equals x.UmbracoDocumentTypeId
        join n in objectContext.umbracoNode on t.nodeId equals n.id
        select new {  
          t = t,  
          n = n  
        };  

答案 3 :(得分:0)

试试这肯定会有用

var Salary = from SalaryTable in testEntity.Salary 
             from MonthTable in testEntity.Month 
             where SalaryTable.Month == MonthTable.Month1 
             select SalaryTable,

还要记住,你不能返回一个匿名类型,即来自单个列表或var中的两个表的数据,因为你必须创建一个具有属性的类,你需要返回并迭代它并返回新创建的类作为获得所需输出的列表。