Проблема лямбда-выражения - PullRequest
1 голос
/ 30 марта 2011

Я новичок с лямбда-выражениями и linq и не могу понять, что я делаю не так:

GroupSet groupToChange = context.GroupSet.Select(q => q.groupId == groupId);

Я пытаюсь получить и изменить имя сущности.

groupToChange.groupName = newGroupName;

У меня нет проблем со второй строкой.Есть идеи?Он говорит мне, что я не могу преобразовать bool в GroupSet, но функция возвращает то, что находит, верно?

Ответы [ 4 ]

5 голосов
/ 30 марта 2011

Вы хотите использовать Where вместо Select.

Where возвращает все, что соответствует предоставленному лямбда-выражению.
Select - преобразование.Он преобразует каждый элемент, используя предоставленное лямбда-выражение.

Кроме того, Where возвращает IEnumerable<T>, поскольку он не может знать, что только один элемент будет соответствовать вашему условию.Если вы знаете, что он вернет только один результат, добавьте Single к запросу, чтобы вернуть только один элемент.Только тогда он скомпилирует:

GroupSet groupToChange = context.GroupSet.Where(q => q.groupId == groupId)
                                         .Single();

Если вы не уверены, будет ли совпадать один элемент, используйте SingleOrDefault:

GroupSet groupToChange = context.GroupSet.Where(q => q.groupId == groupId)
                                         .SingleOrDefault();

Разница между этими двумя:
Single сгенерирует исключение, если набор результатов Where пуст.
SingleOrDefault вернет default(T), т. Е. null в вашем случае.

3 голосов
/ 30 марта 2011
GroupSet groupToChange = context.GroupSet.Where(q => q.groupId == groupId);

Поскольку вы хотите, чтобы список фильтровался по условию, используйте «Где» вместо «Выбрать».

groupToChange будет коллекцией, поэтому вы должны назначить newGroupName отдельным элементам в коллекции, если у него есть только один элемент, вы можете сделать следующее

groupToChange.Single().groupName = newGroupName;

в противном случае вам придется выполнить итерациючерез каждый элемент и назначьте их

foreach(var g in groupToChange)
    g.groupName = newGroupName;

Также посмотрите методы SingleOrDefault, First, FirstOrDefault

2 голосов
/ 30 марта 2011

Select - это преобразование, как было указано, поэтому, когда вы говорите:

.Select(q => q.groupId == groupId)

, вы получаете список логических значений, основанный на том, что элемент в GroupSet имеет groupId, равныйдля данного groupId

это вроде как делать:

List<bool> results = new List<bool>; 
foreach(group in GroupSet)
{
    results.Add(group.goupId==groupId);
}
return results;

То, что вы хотите, это либо

  • Where, который будет фильтровать на основелямбда-выражение и возвращает все экземпляры, которые соответствуют фильтру.
  • First, который будет возвращать первый элемент, который соответствует лямбда-выражению (и выдает исключение, если ни один из них не будет)
  • FirstOrDefault, которыйвернет первый элемент, который соответствует или значение по умолчанию (вероятно, ноль в этом случае), если ни один не соответствует
  • Single вернет единственный соответствующий элемент и сгенерирует исключение, если не существует только одного
  • SingleOrDefault вернет единственный соответствующий элемент или значение по умолчанию (возможно, нулевое), еслини один не соответствует, но выдает исключение, если их больше одного.

Что именно выбрать, зависит от таких факторов, как, будет ли список всегда содержать элемент, который соответствует?Это ошибка, если нет?будет больше 1?Больше 1 ошибки.Очевидно, что если вы знаете, что когда-либо будет только один, то First будет быстрее, так как он остановится при попадании в первый, но Single будет повторяться, пока не проверит весь список или не найдет второй элемент.

1 голос
/ 30 марта 2011

Select возвращает IEnumerable<TResult>, и вы хотите вернуть только один элемент - как упоминал Джон, вы должны использовать Single

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...