当查询返回匿名类型时,是否可以使用Take in LINQ?

时间:2009-05-06 21:23:27

标签: c# linq anonymous-types

我正在尝试从LINQ查询返回的匿名类型列表中获取第n个元素,其中n是0到100之间的随机数。现在已经讨论过一段时间了,我没有得到任何地方。我的代码(名称已更改为保护IP):

var query = from Table1 t1 in theContext.Table1 
   join Table2 t2 in theContext.Table2
    on ... 
    where ... 
   select new 
   {
       partNum = t1.part_number, 
       partSource = t2.part_source
   }

int num = new Random().Next(0, 100); 

// here's where the code I've tried fails 

我可以以某种方式使用Take<T>(100).ToList<T>()[num]来获取具有partNum和partSource的单个匿名类型吗?我最后通过明确定义一个类型来解决这个问题,但似乎我在这里错过了一个更优雅的解决方案。我想做的就是向调用者返回一个Dictionary<string, string>,所以我不想在这个方法之外定义一个类型。

更新:ElementAt不适用于此。我尝试添加:

// get a random part from the parts list
int num = new Random().Next(0, query.Count() - 1 );
var nthElement = query.ElementAt(num);

我得到一个例外:The query operator 'ElementAt' is not supported.

2 个答案:

答案 0 :(得分:6)

你应该可以使用:

var item = query.Take(100).ToList()[num];

当然,这样做会更有效:

var item = query.Skip(num).First();

答案 1 :(得分:3)

我相信你只想要ElementAt扩展方法:

var nthElement = query.ElementAt(num);

无需混淆Take个问题等等,当然也不会ToList