将匿名类型转换为数组或arraylist。可以吗?

时间:2010-02-01 22:09:45

标签: c# linq linq-to-sql

尝试使用数据库中的linq检索数据。我想使用匿名类型并转换为Ilist,Array,ArrayList或Collection。数据用于接受Ilist,arraylist或集合的第三方对象。

我似乎无法让这个工作。我收到以下错误,“类型'System.String'不支持序列运算符”

using (var db = new dbDataContext())
{
    var query = from e in db.people
                select new
                {
                    Count = e.LastName.Count()
                };

    Array test;
    test = query.ToArray();
}

2 个答案:

答案 0 :(得分:8)

将结果转换为数组列表甚至是匿名类型都没有任何关系。这是您的代码的另一个版本将失败:

using (var db = new dbDataContext())
{
    var query = db.people.Select(x => x.LastName.Count());
    foreach (int x in query)
    {
        Console.WriteLine(x);
    }
}

那仍然会以同样的方式失败 - 因为它是这个位的翻译:

x => x.LastName.Count()

进入导致问题的SQL。

将其更改为:

x => x.LastName.Length

我怀疑你会发现它有效。请注意,这不是C#问题 - 它只是LINQ to SQL的翻译能力。

我建议你在这里使用匿名类型 - 这是毫无意义的。也许这不是你的完整代码,但总的来说,如果你发现自己创建了一个只有一个成员的匿名类型,那么问问自己,这对你有什么好处。

答案 1 :(得分:2)

ArrayList类有一个接受ICollection的构造函数 您应该能够为它提供LINQ结果的List版本。

using (var db = new dbDataContext()) {
        var query = from e in db.people
                    select new { Count = e.LastName.Count() };

        ArrayList list = new ArrayList(query.ToList());
}

我这里没有Visual Studio(我在Mac上),但它可能有所帮助。 (ToArray也应该足够了)

您可能需要按长度替换Count()。