在我看来,Linq 只能查询给定的数据源,也就是说,它浏览它并根据需要从中返回内容,但不会更改任何内容。然而,我在这件事上找到的一些答案中的措辞让我怀疑这种理解。我的理解在所有情况下都正确吗?一个 linq 查询可以改变它关联的数据源的内容吗?
问问题
374 次
1 回答
7
一个 linq 查询可以改变它关联的数据源的内容吗?
是的,尽管这是一个坏主意。
LINQ 查询(至少使用 LINQ to Objects)通过使用委托进行过滤或映射操作来工作。一般来说,这些不应该引起副作用,但这并不意味着如果你强迫他们这样做,他们就不能这样做。实际的 LINQ 方法不会更改数据,但它们通过委托工作,这些委托只是您提供的代码,这意味着代码可以做任何事情。
请注意,这通常是一个坏主意。
例如,假设您正在对一组Person
实例进行查询:
var results = people.Where(p => p.Name == "Foo")
.Select(p =>
{
// This is evil, don't do it!
p.Name = "Bar";
return p;
});
话虽如此,这不太可能与 LINQ 一起针对IQueryable<T>
. 在这种情况下,您提供的 lambda 将被转换为Expression
,而提供者又需要将其转换为其他形式(即:实体框架将其转换为 SQL)。因此,只有在提供程序的编写方式可以转化为有意义的形式时,您才能创建副作用,而这种情况不太可能发生。
于 2013-10-10T21:39:27.520 回答