【问题标题】:ef and linq extension methodef 和 linq 扩展方法
【发布时间】:2011-03-11 19:23:07
【问题描述】:

我有这个 sql,我想用 linq 扩展方法编写,从我的 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 扩展方法中重写吗?

【问题讨论】:

    标签: linq entity-framework extension-methods


    【解决方案1】:

    假设您已将 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 中的任何条目没有与其相关的地址,您可能会遇到异常,尽管我还没有尝试过。

    【讨论】:

    • 感谢您的回复,但我正在寻找另一种解决方案,其中查询返回不是投影。
    • 我不确定您要查找的查询类型;你的意思是你只想要 Person 实体和(每个)他们的最新地址?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多