使用Entity Framework在DBSet中选择行

5

我正在尝试从一个DbSet对象中基于WHERE子句获取行。我有以下代码:

dbContext.Workers

我可以得到以下列表:

我可以得到这样的一个列表:

workers = m.Workers.Where(w => w.BranchId == curUser.BranchId).ToList<Worker>();

但是,从返回值可以看出,它返回一个 List<Worker>,我无法使用像 workers.Find(WorkerId) 这样的方法。

基本上,我正在尝试返回一个基于一些筛选条件的 DBSet 类型。我的意思是我想在 DBSet 类上使用 LINQ。我需要这样做是因为我需要使用 workers.Find(WorkerId) 方法,也许我还需要更新此模型。因此,我将根据 where 子句获取列表,更改一些值,并使用 dbContext.SaveChanges()。这可行吗?

谢谢

1个回答

5

Where(...) 返回一个IQueryable,您可以在查询运行之前对其进行操作。ToList()将强制执行查询并将对象放入内存中。如果您想在查询之后“查找”项,则可以使用List执行以下操作:

workers.SingleOrDerfault(x => x.WorkerId == WorkerId);

如果您将它们都像这样存储在内存中,并进行更改,则可以通过调用.SaveChanges()来保留这些更改。

但是,如果您需要在查询到达数据库之前对IQueryable应用更多过滤器,则需要在调用ToList()之前操作IQueryable。


所以即使它是IQueryable,当我改变其中的一些值时,DBSet也会被更新?这似乎既奇怪又好。我现在正在尝试这个,谢谢。 - user5273382
不,虽然它是IQueryable,但你还没有记录,你只有从数据库中获取它们、应用其他过滤等潜力。如果你想要进行持久化更改,你必须执行操作。阅读有关延迟执行的更多信息。 - Colorado Matt
谢谢,我会先尝试您的解决方案,然后再去了解它。 - user5273382
谢谢,它解决了我的问题。 - user5273382

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接