Linq VAR и типизированный объект - PullRequest
3 голосов
/ 03 марта 2011

Я хотел бы получить образец кода. На данный момент я использую linq в c # и asp.net 4 ef4

       var querySlotOrder = from slot in context.CmsSlots
                             where slot.SlotId == myCurrentSlotId
                             select slot;

           if (querySlotOrder.SlotOrder == myNewSlotOrder)
                e.Cancel = true;

Этот запрос linq возвращает только запись.

Используя VAR, я не могу получить Typed Object и не могу получить доступ к его свойству SlotOrder.

Как изменить запрос? спасибо за вашу помощь

Полезно ресурса по теме:

http://msdn.microsoft.com/en-us/library/bb384065.aspx

http://msdn.microsoft.com/en-us/library/bb397947.aspx

http://msdn.microsoft.com/en-us/library/bb397678.aspx

Ответы [ 7 ]

7 голосов
/ 03 марта 2011

Даже если ваш запрос возвращает один объект, метод Select, который вы используете за кулисами, не делает. Возвращает IQueryable<T> в EF.

Вы должны использовать метод, такой как Single, SingleOrDefault, First, FirstOrDefault, если вы хотите сохранить один объект.

var querySlotOrder = (from slot in context.CmsSlots
                      where slot.SlotId == myCurrentSlotId
                      select slot).Single();

Разница между четырьмя методами:

  • Single: возвращает единственный элемент последовательности и выдает исключение, если в последовательности нет точно одного элемента.
  • SingleOrDefault: возвращает единственный элемент последовательности или значение по умолчанию, если последовательность пуста; этот метод генерирует исключение, если в последовательности более одного элемента.
  • First: возвращает первый элемент последовательности.
  • FirstOrDefault: возвращает первый элемент последовательности или значение по умолчанию, если последовательность не содержит элементов.

(Определения от MSDN )

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

Тип возвращаемого объекта: IQueryable<CmdSlot> (при условии, что CmdSlot является типом элементов), и querySlotOrder получает этот тип (это эффект var; var сам по себе не является тип). Если вы абсолютно уверены, что в наборе результатов всегда будет ровно один элемент, вы можете получить его с помощью querySlotOrder.Single().

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

LINQ select -статмент всегда возвращает запрашиваемую коллекцию.Поэтому вам нужно извлечь из него один объект.

var querySlotOrder = (from slot in context.CmsSlots
                      where slot.SlotId == myCurrentSlotId
                      select slot).FirstOrDefault();
3 голосов
/ 03 марта 2011

Запрос linq возвращает не запись, а набор записей, содержащий только 1 элемент. Если вы хотите получить первый элемент и уверены, что в коллекции только 1 элемент, используйте метод Single extension:

var querySlotOrders = from slot in context.CmsSlots
                      where slot.SlotId == myCurrentSlotId
                      select slot;
var querySlotOrder = querySlotOrders.Single();

if (querySlotOrder.SlotOrder == myNewSlotOrder)
    e.Cancel = true;
2 голосов
/ 03 марта 2011

Как указывает Денис в своем ответе, вы не получаете экземпляр одного объекта, вы получаете IEnumerable обратно из вашего запроса.Чтобы получить доступ к свойству SlotOrder, вам нужно выбрать определенный элемент из коллекции, скорее всего, первый - судя по вашему запросу.

0 голосов
/ 03 марта 2011

Это код madd0, но он переформатирован для использования стиля C # вместо стиля SQL

var querySlotOrder = context.CmsSlots
  .Where(slot => slot.SlotId == myCurrentSlotId)
  .Single();

лучше читать и понимать, чем стиль SQL

0 голосов
/ 03 марта 2011

Почему вы используете var? если вы знаете тип ожидаемого объекта, введите querySlotOrder:

MyObjectType querySlotOrder = (from slot in context.CmsSlots
                             where slot.SlotId == myCurrentSlotId
                             select slot).FirstOrDefault();

           if (querySlotOrder.SlotOrder == myNewSlotOrder)
                e.Cancel = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...