Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为linq to sql实体创建可查询属性_.net_Linq To Sql_Lambda_Iqueryable - Fatal编程技术网

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

.net 为linq to sql实体创建可查询属性,.net,linq-to-sql,lambda,iqueryable,.net,Linq To Sql,Lambda,Iqueryable,我在SQL Server中有一个简单的表结构: 一个表存储自行车(Bikes)列表,另一个表存储自行车所有者(owner)的历史列表 我使用LINQ2SQL生成了一个模型,该模型为我提供了一个“Bike”实体,它与“Owner”具有1对多的关系,称为“historicalowner” 到目前为止还不错 现在我有很多疑问,我对当前的所有者感兴趣。当前所有者是所有者表中的最新条目 repo.Bikes().Where(b => b.HistoricalOwners.OrderByDescend

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

一个表存储自行车(Bikes)列表,另一个表存储自行车所有者(owner)的历史列表

我使用LINQ2SQL生成了一个模型,该模型为我提供了一个“Bike”实体,它与“Owner”具有1对多的关系,称为“historicalowner”

到目前为止还不错

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

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")
这将进行编译,但在运行时它将失败,原因是:

成员“CurrentOwner”没有支持的SQL转换

这完全有道理

有人知道我如何创建一个CurrentOwner来让这个查询工作吗

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

然后我想知道是否可以为CurrentOwner向我的LINQ2SQL存储库添加一个额外的关系,并将其限制为一对一。但我似乎无法用LINQ2SQL实现这一点。我想我可以用LINQ2实体来实现,但目前这不是一个选项

有人知道我该怎么做吗

提前感谢,

rmk

您是否尝试过:

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

看看这是否能转化为SQL?

我不认为你真的能以你想要的方式来做这件事

我的建议是:

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

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


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

这是行不通的,与First()没有什么不同它仍然不知道如何将CurrentOwner转换为SQL,因为CurrentOwner是一个属性,因此无法转换为表达式。我已经想到了这一点,但我真的希望这不是答案。我不愿意引入管理额外属性的开销+对数据库的外部更改也必须更新这种新关系。我支持你RMK。对于现有模型,必须有一种方法来实现这一点。您真正要做的就是让L2S建立@Sam建议手动添加的关系,但在查询中。L2S肯定能做到这一点吗?