MVC控制器动作中的LINQ导航属性?

时间:2011-03-16 01:38:00

标签: c# asp.net-mvc linq

我有点擅长这种最佳做法..

我有一个存储库,可以返回IQueryable。这是控制器中的正确用法吗?

var whatever = ObjectRepository.GetWhatever(id);
var videoId = whatever.UsersInObject1InObjects2.First().Object.Video.ExternalVideoId;

“.Object”和“.Video”上面的第二行中引用了与“whatever”表相关的表。

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

2 个答案:

答案 0 :(得分:0)

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

我听说过不建议从实体框架等ORM返回IQueryable,因为这样做,如果你在控制器中不小心你的模型,你可能会多次对你的后端执行查询视图。这是因为在EF IQueryable中表示尚未执行的查询。通过返回IEnumerable而不是IQueryable,您可以确保查询执行仅限于您的存储库类。

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

答案 1 :(得分:0)

您实际在做的是使用集合进行查询。 我认为您需要更好地了解linq查询。 您不希望向存储库添加自定义查询。 您只想公开可查询的界面,如此...

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

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

然后你可以使用linq to sql