C# MVC控制器操作中的LINQ导航属性?

C# MVC控制器操作中的LINQ导航属性?,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有点犹豫这是否是最佳实践 我有一个存储库,它返回一个IQueryable。这在控制器中是否正确使用 var whatever = ObjectRepository.GetWhatever(id); var videoId = whatever.UsersInObject1InObjects2.First().Object.Video.ExternalVideoId; 其中“.Object”和“.Video”是对与“whatever”表相关的表的引用 或者我应该在另一个存储库中创建另一个函数来

我有点犹豫这是否是最佳实践

我有一个存储库,它返回一个IQueryable。这在控制器中是否正确使用

var whatever = ObjectRepository.GetWhatever(id);
var videoId = whatever.UsersInObject1InObjects2.First().Object.Video.ExternalVideoId;
其中“.Object”和“.Video”是对与“whatever”表相关的表的引用


或者我应该在另一个存储库中创建另一个函数来获取ExternalVideoId吗?

我通常这样做。我创建了一个单独的模型类,它封装了控制器从数据库中需要的数据。(即,作为一项规则,我不为此使用ORM类)。这允许我用可能需要的所有类型的属性来注释模型类成员。在存储库代码中,我查询ORM,然后返回模型类(或模型的IQueryable/IEnumerable)作为结果

我听过这样一种观点,即不建议从ORM(如Entity Framework)返回IQueryable,因为这样做,如果您不小心在controller/view中使用您的模型,您可能会对后端执行多次查询。这是因为在EF IQueryable中表示尚未执行的查询。通过返回IEnumerable而不是IQueryable,可以确保查询执行仅限于存储库类


然而,我发现,有时返回IQueryable更方便。例如,对于表分页/排序方案,我可以在执行IQueryable之前将页码、排序方向、页面大小等应用于IQueryable。我觉得这个逻辑更多地属于控制器,而不是存储库。有些人可能不同意。

您实际上是在使用集合进行查询。 我认为您需要更好地了解linq查询。 您不想将自定义查询添加到存储库中。 您只需要像这样公开可查询接口

    public IQueryable<T> Get( IUser identity )
    {
        return Context.Set<T>();
    }

    public IQueryable<IBindable> GetItem( IUser identity )
    {
        return Context.Set<T>().Cast<IBindable>();
    }
publicIQueryable获取(IUser标识)
{
返回Context.Set();
}
公共IQueryable GetItem(IUser标识)
{
返回Context.Set().Cast();
}

然后,您可以使用linq to sql

忽略其他随机接口,这是很有意义的,因此从本质上讲,您的说法是将存储库模式与工作单元模式结合使用?我不是这么说,但这也是一个很好的建议=)问题是,对于如何应用模式,可能会有不同的理解。在我的回答中,我确实提到了存储库模式,但我没有特别提到工作单元模式。当我回答您的问题时,我更多地考虑了检索数据而不是编写数据,所以我没有想到工作单元模式。另一方面,我今天刚刚看到一篇有趣的文章,它与以下内容有着千丝万缕的联系: