【发布时间】:2009-09-25 13:51:26
【问题描述】:
我有一个 LINQ 查询,我想在其中返回修改后的对象。如果我处于一种不变的函数式情绪中,我可能会做一些类似于复制构造器的事情,如下所示:
from widget in widgets select new widget { legs = widget.legs + 1, arms = widget.arms }
遗憾的是,我在一个可变的 NHibernate 实体对象上执行此操作,我必须修改原始对象。我正在寻找一些带有副作用的匿名方法的语法,例如:
from widget in widgets select { widget.legs += 1; return widget }
(对 Scala 语法表示歉意)
现在,我可以在 LINQ 查询之外执行此更新,但如果可以的话,我宁愿内联进行。是否可以在LINQ中插入void之类的操作?
【问题讨论】:
-
我认为在查询中进行变异是一个糟糕的主意。我认为 Eric Lippert 在本网站的其他地方写了一些语句,以在语句中进行突变,并保持你的表达没有副作用。表达式应该是可组合的,而副作用会杀死它。
-
是的,我原则上同意你的看法。也许我试图在查询中做太多事情。问题是,我只是在做我本来会用投影做的事情。唯一的区别是我使用的是实体而不是值对象,并且该对象的身份是代理项,因此值必须发生变化(而不是处理我将投影到另一个值对象的值对象)身份不同)。但是你关于突变的观点仍然成立。
-
在基于集合的操作中改变查询是完全可以接受的事情。唉,LINQ 还没有。
标签: c# linq nhibernate