如何在 linq 查询中实例化对象

Mys*_*ter 1 linq linq-to-objects instantiation

这是一个理论上的问题,我正在查看其他人的代码(如下),我的简单解决方案是在 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();
Run Code Online (Sandbox Code Playgroud)

无关注意:在这种情况下,Node 构造函数正在从内存缓存中获取数据。

如何改进此示例以仅使用 linq 实例化每个对象一次?

干杯。默里。

And*_*are 5

使用这样的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();
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅let 子句(C# 参考)

在查询表达式中,有时存储子表达式的结果以便在后续子句中使用它是有用的。您可以使用 let 关键字执行此操作,它会创建一个新的范围变量并使用您提供的表达式的结果对其进行初始化。一旦用一个值初始化,范围变量就不能用于存储另一个值。但是,如果范围变量包含可查询类型,则可以对其进行查询。