Linq возвращает список или один объект

Linq возвращает список или один объект

Ответов: 8


11 принят

EDIT : на основе вашего обновления ошибка может быть связана с перечислением в классе сущности. Смотрите эту запись в блоге для получения дополнительной информации и работы. Я оставляю свой первоначальный ответ в качестве улучшения вашего синтаксиса запроса.

Попробуйте сделать выбор первого объекта в самом запросе с помощью FirstOrDefault, а затем проверить, является ли результат нулевым.

int compareCategory = (int)pCategory; // just a guess
var result = (from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == compareCategory
              select r).FirstOrDefault();

if (result != null)
{
     return new oMachineRevision(result.IdMachineRevision);
}

2

Почему бы просто не использовать FirstOrDefault () вместо этого и проверить значение null? Я не вижу преимущества при запросе счетчика, а затем беру первый элемент.


2

В стандартной реализации linq операторы «выбирают» и «где» сопоставляют методы, возвращающие IEnumerable или IQueryable. Поэтому стандартные методы linq при использовании должны всегда возвращать IEnumerable из вашего запроса не как отдельный объект.

Но методы linq, которые являются кандидатами для операторов linq, не ограничены методами, возвращающими IEnumerables, любой метод, возвращающий что-либо, может быть выбран.

Если у вас есть методы экземпляра под названием «Выбрать» и «Где», которые возвращают один объект или методы расширения, которые являются специфическими для вашего класса, и возвращают один объект, они будут использоваться вместо стандартных linq.

Я предполагаю, что либо метод «Выбрать», либо «Где», определенный в вашем классе, делает linq возвращать единственное значение вместо a IEnumerable<T>.


1

Я не знал, что в зависимости от результата запроса будут созданы разные анонимные объекты. Я думаю, они просто хотели, чтобы результаты имели тип IEnumerable

Как насчет использования foreach?

var results = from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == pCategory
              select r;

foreach( var r in results )
{
    yield return new oMachineRevision( r.IdMachineRevision );
}

1

Это касается и всех неявных типов. Должен признаться, я продолжаю забывать об этом, и именно так я столкнулся с этим сообщением.

если у вас есть

class ClassA {
               ...

               private string value;

               ...

               public static implicit operator string(ClassA value)
               {
                    return value.ToString();
               } 

              ...
}

вам нужно явно наложить класс на всадник для сравнения.

поэтому я обычно делаю это

    var myClassAStr = myClassA.ToString();

    var x = (from a in entites where a.ValToCompare == myClassAStr select a).first();

// do stuff with x
    ...
C #, LINQ, .net-3,5, перечислений,