我有这个我想用linq扩展方法编写的sql从我的edm返回一个实体:
SELECT p.[Id],p.[Firstname],p.[Lastname],prt.[AddressId],prt.[Street],prt.[City]
FROM [Person] p
CROSS APPLY (
SELECT TOP(1) pa.[AddressId],a.[ValidFrom],a.[Street],a.[City]
FROM [Person_Addresses] pa
LEFT OUTER JOIN [Addresses] AS a
ON a.[Id] = pa.[AddressId]
WHERE p.[Id] = pa.[PersonId]
ORDER BY a.[ValidFrom] DESC ) prt
也可以使用3个连接在linq扩展方法中重写吗?
答案 0 :(得分:0)
假设您已将Person_Addresses表设置为纯关系表(即除了外键之外没有数据),这应该可以解决这个问题:
var persons = model.People
.Select(p => new { p = p, a = p.Addresses.OrderByDescending(a=>a.ValidFrom).First() })
.Select(p => new { p.p.Id, p.p.Firstname, p.p.LastName, AddressId = p.a.Id, p.a.Street, p.a.City });
第一个Select()命令地址并选择最新的地址,第二个返回一个匿名类型,其中包含查询中指定的属性。
如果您的关系表中有更多数据,那么您将不得不使用联接,但这样您就可以免除它们。在我看来,这更容易阅读。
注意:如果Persons中的任何条目没有连接到它们的地址,您可能会收到异常,但我还没有尝试过。