我有点擅长这种最佳做法..
我有一个存储库,可以返回IQueryable。这是控制器中的正确用法吗?
var whatever = ObjectRepository.GetWhatever(id);
var videoId = whatever.UsersInObject1InObjects2.First().Object.Video.ExternalVideoId;
“.Object”和“.Video”上面的第二行中引用了与“whatever”表相关的表。
或者我应该在另一个存储库中创建另一个函数来获取ExternalVideoId?
答案 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