在我看来,Linq只能查询给定的数据源,也就是说,它浏览它并根据需要从中返回内容,但不会改变任何内容。但是,我在这个问题上找到的一些答案中的措辞让我怀疑这种理解。在所有情况下,我的理解是否正确? linq查询是否可以更改与其关联的数据源的内容?
答案 0 :(得分: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
,然后需要由提供程序将其转换为其他形式(即:Entity Framework将其转换为SQL)。因此,如果提供者的编写方式可以转化为有意义的形式,那么您将只能创建副作用,这种情况不太可能发生。