我想在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")
如何做到这一点
答案 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中的两个表的数据,因为你必须创建一个具有属性的类,你需要返回并迭代它并返回新创建的类作为获得所需输出的列表。