为linq to sql实体创建可查询属性

时间:2010-10-29 05:25:28

标签: .net linq-to-sql lambda iqueryable

我在SQL Server中有一个简单的表结构:

一个存储自行车(自行车)列表的表和另一个存储自行车所有者(所有者)历史列表的表。

使用Linq 2 SQL我生成了一个模型,该模型为我提供了一个“自行车”实体,该实体与“所有者”之间存在一对多的关系,名为“HistoricalOwners”。

到目前为止一直很好......

现在我有很多疑问,我对当前所有者感兴趣。当前所有者是所有者表中的最新条目。

repo.Bikes().Where(b => b.HistoricalOwners.OrderByDescending(o => o.Date).First().Name == "Joe")

这有效,但有点难看,并没有真正说出我的要求。在我的Bike实体上创建一个'CurrentOwner'属性并对其进行查询会很好。

public Owner CurrentOwner
{
    get
    {
        return HistoricalOwners.OrderByDescending(o => o.Date).First();
    }
}    

然后我可以这样查询:

repo.Bikes().Where(b => b.CurrentOwner.Name == "Joe")

这会编译,但是在运行时它的cource会失败:

成员'CurrentOwner'没有支持的SQL转换。

这完全有道理。

有没有人知道如何以一种让这个查询起作用的方式创建一个CurrentOwner?

我做了一些研究,让CurrentOwner返回一个Expression树而不是一个实例,但我从来没有得到任何我真正满意的地方。

然后我想知道是否可以为CurrentOwner的linq 2 sql存储库添加额外的关系并将其约束为一对一。但我似乎无法用linq 2 sql做到这一点。我想我可以用Linq 2实体做到这一点,但目前这不是一个选择。

任何人都有任何想法,我可以如何使这项工作?

提前致谢,

RMK

2 个答案:

答案 0 :(得分:0)

你试过了吗?

public Owner CurrentOwner
{
    get
    {
        return HistoricalOwners.OrderByDescending(o => o.Date).FirstOrDefault();
    }
}  

查看是否转换为SQL?

答案 1 :(得分:0)

我认为你不能按照你想要的方式做到这一点。

我的建议:

CurrentOwnerID表上创建一个新的数据库列Bike,该表是OwnerID表上的Owner的FK。将其映射为模型中的关联,然后您可以按照您希望的方式查询CurrentOwner

缺点是您必须根据任何其他映射属性管理CurrentOwner的值 - 您无法使用原始示例中的其他查询来派生它,因此它可能不适合您的应用程序。

然而,这就是我过去解决此类问题的方式,它为您的模型提供了更大的灵活性 - 您可以选择当前所有者是谁,而不是依赖于派生结果,并且它很容易理解