2009-05-06 3 views
3

Я пытаюсь получить n-й элемент из списка анонимных типов, возвращаемых запросом LINQ, где n - это случайное число от 0 до 100. Теперь он обходит его, и я никуда не денусь , Мой код (с именами изменен для защиты IP):можно использовать Take в LINQ, когда запрос возвращает анонимный тип?

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.

ответ

6

Вы должны быть в состоянии использовать:

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

Конечно, было бы более эффективно делать:

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

Я что-то пропустил? Разве он просто не хочет использовать функцию ElementAt? – Noldorin

+0

(ответил на другой ответ, для видимости) –

+0

ElementAt возвращает: «ElementAt не поддерживается ... System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall (MethodCallExpression mc)« – jcollum

3

Я считаю, что вам просто нужен способ расширения ElementAt:

var nthElement = query.ElementAt(num); 

Нет необходимости возиться с Take запросов или таких, и, конечно, не ToList.

+0

re ваш комментарий к моему ответу; мой первый пример (Take/ToList) - это просто показать, как его попытка может быть исправлена. Существует не так много выбора между Skip (...). First() и ElementAt (...), и я уже дал вам +1 ;-p –

+0

@Marc: Да, я понял, что вы просто исправляете его использование Take/ToList. (Я отвечал исключительно на его вопрос, а не на ваш ответ, чего я еще не видел). Действительно, использование Skip и First - это всего лишь ненужная разработка ... – Noldorin

+0

Нет, я попробовал ElementAt, и это не сработало : «Оператор запроса ElementAt не поддерживается» – jcollum