使用where子句查询选择和匿名对象

时间:2013-06-13 11:00:58

标签: c# linq

这是我的代码:

var tree = new
{
    id = "0",
    item = new List<object>()
};

foreach ()
{
    tree.item.Add(new
    {
        id = my_id,
        text = my_name,
        parent = my_par
    });
}

但我想用以下内容替换foreach中的代码:

foreach ()
{
    tree.item.Where(x => x.id == 2).First().Add(new
    {
        id = my_id,
        text = my_name,
        parent = my_par
    });
}

怎么做?我得到的例外是该类型不包含id的定义。

这里的问题是匿名类型。

我尝试创建一个具有2个属性的新类:id,text和parent,语法有效,但树的定义无效。

所以这里的问题是如何对匿名类型进行查询,而不添加一个代表匿名类型的新类。

2 个答案:

答案 0 :(得分:3)

如果您想在不创建新课程的情况下这样做,可以使用dynamic进行过滤。

tree.item.Where(x => ((dynamic)x).id == 2).First()....

虽然这会给你一个匿名对象而不是一个集合,所以你不能添加任何东西。

答案 1 :(得分:1)

一,这真的很难看。你应该考虑为此声明一个类(你为此假设了一些纯粹主义者的暗示;)

二,你做的事情是不可能的。考虑一下,在你的第一个循环中当你tree.item.Where(x => x.id == 2).First()时,你得到x,这是一个对象而对象没有{{1 }} 方法。为了说明,请举例:

Add

现在你做的时候

var tree = new
{
    id = "0",
    item = new List<object> 
    { 
        new
        {
            id = 2,
            text = "",
            parent = null
        }
    }
};

你得到了这个

var p = tree.item.Where(x => x.id == 2).First(); //even if that was compilable.

回。现在你怎么去new { id = 2, text = "", parent = null } 那个东西?它确实是一个没有方法的匿名类型。

我只能假设,但你可能想要这个:

Add

或者在一行中:

var treeCollection = new
{
    id = 0,
    item = new List<object> // adding a sample value
    { 
        new // a sample set
        {
            id = 2, 
            text = "",
            parent = null // some object
        }
    }
}.Yield(); // an example to make it a collection. I assume it should be a collection

foreach (var tree in treeCollection)
{
    if (tree.id == 0)
        tree.item.Add(new
        {
            id = 1,
            text = "",
            parent = null
        });
}

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}