有没有办法在查询中设置属性?
var products = from p in Products
let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
// somehow set p.Price = pricecalc
select p;
我知道我可以使用select new Product { .. set props here .. }
,但我不想这样做。
此刻,我想我将不得不使用foreach
来做这件事。
答案 0 :(得分:2)
是的,但您需要一种扩展方法:
public static TSource Apply<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
where TSource : class // wouldn't work for value types, since the action would work on a copy
{
foreach(var item in source)
{
action(item);
yield return item;
}
}
然后您可以像这样使用它:
var products = Products.Apply(p => p.Price = p.IsDiscontinued ? 0 : p.UnitPrice);
但是我不建议这样做; Linq查询不应该产生副作用。您应该更改查询以返回包含更新价格的新对象。
答案 1 :(得分:2)
而不是
let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
使用
let pricecalc = (p.Price = p.IsDiscontinued ? 0 : p.UnitPrice)
答案 2 :(得分:1)
Products.Select(p => {
var pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice;
p.Price = pricecalc;
return p;
})
答案 3 :(得分:1)
你可以将其用于LINQ语句,但据我所知,如果没有某种解决方法,就没有办法明确地做到这一点。
这样的事情可以在不需要任何额外方法的情况下处理它:
var products = from p in Products
let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
//introduce a throwaway let variable, just to modify something on p
let ignored = p.Price = pricecalc
select p;
正如其他人所说,我建议不要这样做。