ef和linq扩展方法

时间:2010-07-05 07:46:38

标签: linq entity-framework extension-methods

我有这个我想用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扩展方法中重写吗?

1 个答案:

答案 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中的任何条目没有连接到它们的地址,您可能会收到异常,但我还没有尝试过。