我在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
答案 0 :(得分:0)
你试过了吗?
public Owner CurrentOwner
{
get
{
return HistoricalOwners.OrderByDescending(o => o.Date).FirstOrDefault();
}
}
查看是否转换为SQL?
答案 1 :(得分:0)
我认为你不能按照你想要的方式做到这一点。
我的建议:
在CurrentOwnerID
表上创建一个新的数据库列Bike
,该表是OwnerID
表上的Owner
的FK。将其映射为模型中的关联,然后您可以按照您希望的方式查询CurrentOwner
。
缺点是您必须根据任何其他映射属性管理CurrentOwner
的值 - 您无法使用原始示例中的其他查询来派生它,因此它可能不适合您的应用程序。
然而,这就是我过去解决此类问题的方式,它为您的模型提供了更大的灵活性 - 您可以选择当前所有者是谁,而不是依赖于派生结果,并且它很容易理解