When is the right time to make ToList on an entity framework query
这是为我服务的。现在我问自己,什么时候应该对查询执行.tolist()以实现实体?
我必须这么做吗?因为我的应用层无论如何都会将实体转换为JSON数组,最后必须枚举枚举器…
我应该这样想吗?还是只将物化集合返回到我的应用程序层更好?
1 2 3 4 5 6 7
| IEnumerable<BrowseSchoolyearDTO> ISchoolyearService.GetAll(int userId)
{
return _context.Schoolyears
.Where(s => s.UserId == userId)
.Select(s => s.ToBrowseSchoolyearDto())
.ToList();
} |
- 尼夫。1.列出在作出反应时所列的各项内容。
- Stackoverflow.com/questions/4844660/&Hellip的可能重复;Worth doing a search on the difference between EDOCX1 commercial nabic,EDOCX1
- @Philsoady just read about iqueryable again and I want that my where clause/filter is done on the server so I will choose iqueryable right?
- Chained wants use iques to get passed to"server"eg db.11 It has been listated,any subsequent where is done on the memory object.Here is another classic post on the subject stackoverflow.com/questions/2876616/&Hellip;
- "Subsequent where…"You mean when I append a tolist(……)to the iques object and after this I do A.Where it is done immemory?那声音清净。Tolist(……)or a foreach trigger the query and materialize the entities to the local context.
只要在数据库连接处于活动状态时完成了对DTO的所有操作,就根本不需要执行.tolist。如果需要在DB事务外部枚举和返回列表,则只需执行.to list。
因此,如果您的代码看起来像这样:
编辑:将存储库更改为服务,因为您不使用存储库
使用(var rep=new service()){var list=rep.getall(1);返回list.select(x=>new dtoviewModel(x)).tolist();}你不需要,托利斯
如果代码看起来像这样:
1 2 3 4 5 6
| using(var rep = new service())
{
var list = rep.GetAll(1);
}
return list.Select(x => new DTOViewModel(x)); |
那你就需要一个托勒斯特。
编辑以显示更多方法
1 2 3 4 5 6 7 8 9 10 11
| public void DoSomeOperationCalledFromWeb(int id)
{
IEnumerable<DTO> list;
using(var serv = new Service())
{
list = rep.GetAll(1).ToList();
/** OR if you need additional filtering **/
list = rep.GetAll(1).Where(/**some filtering**/).ToList();
}
/** Do operations on list **/
} |
- 我确信第一个代码示例将抛出一个ObjectDisposedException…
- 六羟甲基三聚氰胺六甲醚。。我以为它会列举出能做选择部分的列表。我来测试一下。
- 我担心的是,当我不tolist()时,我的应用程序层将"转到"数据库,以便我对返回的数据进行foreach…
- 皮埃尔,你说得对。它不在select上执行枚举。更新了代码。谢谢
- Elisa->是的。我不建议在您的存储库中执行.tolist,但可能还有其他问题可以验证.tolist的使用,因此在不了解您的应用程序的情况下很难说出其中一个。如果可能,请在实际需要响应时保留枚举。为什么应用层启动.tolist是一个问题?如果您关心的是安全性(某人背负着SQL),我认为您不必担心,但还没有对此做过研究。
- @Zaphod我不使用存储库/using语句。我的上下文最终是由Web请求在其生存期内创建的,因此当返回对客户端的响应时,应该关闭连接。因此,您的代码示例不适合我的场景,或者请对它们进行调整。
- @在我的注释和代码中,Elisa只是将存储库与服务进行了切换,应该基本相同。我已经习惯了存储库,所以我会自动使用这个术语。如果您还想让我给您举个例子,请在您呼叫服务的地方张贴示例代码。如果我有你的代码,我给你举个例子会更快。
- @Elisa做了一些更新,看看是否有帮助。