3

有没有办法在查询中间设置属性?

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 .. },但我不想这样做。

目前,我在想我将不得不使用 aforeach来做到这一点。

4

4 回答 4

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 查询不应该产生副作用。您可能应该更改查询以返回包含更新价格的新对象。

于 2012-05-23T15:19:17.477 回答
2

代替

 let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice

采用

 let pricecalc = (p.Price = p.IsDiscontinued ? 0 : p.UnitPrice)
于 2012-05-23T15:24:49.907 回答
1
Products.Select(p => {
    var pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice;
    p.Price = pricecalc;
    return p;
})
于 2012-05-23T15:19:22.627 回答
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; 

正如其他人所说,我建议不要使用这种方法。

于 2012-05-23T15:24:01.573 回答