получаю ошибку после преобразования результата вывода ExecuteQuery() в список

Я использую linq to sql для своего проекта. Но получаю ошибку после преобразования результата ExecuteQuery() с использованием расширения .ToList():

var logentries = DB.ExecuteQuery<keyValueList>(string.Format(query));
keyValueList kv1 = logentries.ToList();// -->Error in this line as: 

Ошибка:

Невозможно неявно преобразовать тип System.Collections.Generic.List в DataLib.keyValueList.


person sameer pradhan    schedule 03.09.2013    source источник
comment
Ваш тип keyValueList — это не список‹..›, а одна запись возвращаемого списка.   -  person Matten    schedule 03.09.2013
comment
Я бы также использовал var kv1 = logentries.ToList(); тогда вам все станет ясно   -  person Yaugen Vlasau    schedule 03.09.2013


Ответы (1)


ToList возвращает List<T>, где T равно keyValueList. Но я думаю, вам нужен один объект, тогда либо используйте First/FirstOrdefault, либо Singler/SingleOrDefault:

keyValueList kv1 = logentries.FirstOrDefault();

Разница в том, что методы ...OrDefault возвращают null, если входная последовательность пуста, тогда как First/Single выдает исключение. Кроме того, Single генерирует исключение, если имеется более одного элемента (полезно, если это невозможно и должно вызываться, например, потому что вы фильтруете по уникальному свойству).

person Tim Schmelter    schedule 03.09.2013
comment
И вы можете проверить, является ли List.Count() > 0, прежде чем использовать First() или FirstOrDefault(). Меня слишком много раз сжигали с помощью FirstOrDefault(). - person WEFX; 03.09.2013
comment
@WEFX: никогда не используйте Count(), если вы хотите узнать, есть ли он, используйте Any. В противном случае вы выполните весь запрос и подсчитаете каждый элемент, чтобы знать, что есть хотя бы один. Если вы используете FirstOrDefault, вам не нужно использовать Any. Просто проверьте if(kv1 != null) ..... - person Tim Schmelter; 03.09.2013
comment
На самом деле я хочу вернуть список KeyValuePair из запроса выбора. Поскольку я использую Datacontext, просто хочу знать, что вернет ExecuteQuery(). Я думал, что буду использовать logentries в foreach, чтобы получить желаемый список и вернуть его. - person sameer pradhan; 04.09.2013
comment
@sameerpradhan: Тогда вам нужен List<keyValueList> kv1 = logentries.ToList();. - person Tim Schmelter; 04.09.2013