这是一个理论问题, 我正在查看其他人的代码(下面),我的简单解决方案是在linq之外实例化集合,但我猜可能会出现我想要在查询中实例化对象的情况,也许只有选择元素。 这是一个简单的例子,说明了如何完成(非常糟糕)。
var pods = (from n in ids
where new Node(Convert.ToInt32(n)).HasValue("propertyName")
select new
{
Id = Convert.ToInt32(n),
Url = new Node(Convert.ToInt32(n)).Url,
Name = new Node(Convert.ToInt32(n)).Title()
}).ToList();
不相关注意:在这种情况下,Node构造函数从内存缓存中获取数据。
如何改进此示例以仅使用linq实例化每个对象?
干杯。 默里。
答案 0 :(得分:4)
使用像这样的let
子句:
var pods = (
from n in ids
let id = Convert.ToInt32(n)
let node = new Node(id)
where node.HasValue("propertyName")
select new
{
Id = id,
Url = node.Url,
Name = node.Title()
}
).ToList();
有关详细信息,请参阅let clause (C# Reference):
在查询表达式中,有时是 用于存储结果 子表达式以便在其中使用它 后续条款。你可以这样做 使用let关键字创建一个 新的范围变量并初始化它 用你的表达结果 供应。一旦用值初始化, 范围变量不能用于 存储另一个值。但是,如果 range变量包含可查询类型, 它可以被查询。