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

时间:2010-01-21 01:26:10

标签: 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();

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

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

干杯。 默里。

1 个答案:

答案 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变量包含可查询类型,   它可以被查询。