2010-02-01 84 views
3

尝试从数据库中使用linq检索数据。我想使用匿名类型并转换为Ilist,Array,ArrayList或Collection。数据用于接受Ilist,数组列表或集合的第三方对象。将匿名类型转换为数组或ArrayList。可以这样做

我似乎无法得到这个工作。我收到以下错误,

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

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

奇数,这适用于我: int [] iss = {324,4,3,2,1}; var query = from e in iss select new { Count = e }; Array test; test = query.ToArray(); – jestro 2010-02-01 22:13:41

回答

8

它什么都没有做的结果转换为数组列表,甚至是匿名类型“不支持类型‘System.String’序列运营商”。这是你的代码的另一个版本,它将会失败:

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的翻译能力。

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

+0

为什么没有意义?在LINQ中获取SELECT COUNT(*)FROM表的最佳方法是什么? – 2010-02-02 02:13:01

+0

@Dwight T:我会使用'db.people.Count()'。即使你需要过滤等,你也不需要匿名类型。 – 2010-02-02 06:25:49

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()。