C# 在选择项之前,能否在linq查询中设置属性? < P>是否有任何方法在查询中间设置属性?
C# 在选择项之前,能否在linq查询中设置属性? < P>是否有任何方法在查询中间设置属性?,c#,.net,linq,list,linq-to-objects,C#,.net,Linq,List,Linq To Objects,var products = from p in Products let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice // somehow set p.Price = pricecalc select p; 我知道我可以使用选择新产品{..在这里设置道具..}但我不想这样做 目前,我想我必须使用一个foreach来完成这项工作。是的,但您需要一个扩展方法
var products = from p in Products
let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
// somehow set p.Price = pricecalc
select p;
我知道我可以使用选择新产品{..在这里设置道具..}
但我不想这样做
目前,我想我必须使用一个
foreach
来完成这项工作。是的,但您需要一个扩展方法:
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;
}
}
然而,我不建议这样做;Linq查询不应该产生副作用。您可能应该更改查询以返回包含更新价格的新对象。您可以将其转换为LINQ语句,但据我所知,如果没有某种解决方法,无法显式执行此操作
Products.Select(p => {
var pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice;
p.Price = pricecalc;
return p;
})
像这样的东西可以处理它,而不需要任何额外的方法:
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;
正如其他人所说,我建议反对这种做法。而不是
let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
使用
您可以将其破解到LINQ中,但最好在foreach
循环中明确您正在做什么以及为什么要这样做。这在我的代码(实体框架)中起作用(但在LinqPad、LINQ to sql中不起作用)。它是最干净的(尽管我讨厌它):)。所以你得到了提示:)我首先在linqpad中尝试过(相信我,它正在工作),然后只粘贴在这里。对于linq到sql,我不确定linq查询是否会转换为sql查询
let pricecalc = p.IsDiscontinued ? 0 : p.UnitPrice
let pricecalc = (p.Price = p.IsDiscontinued ? 0 : p.UnitPrice)