2015-10-08 2 views
-1
 //This works, but seems incorrect to me 
     Object selection = db.ExampleTable 
          .Where(s => s.Id == id) 
          .Select(s => new { s.Id, s.PropIWantToShow }) 
          .SingleOrDefault(); 

     //This seems correct, but does not work 
     Object selection = db.ExampleTable 
           .SingleOrDefault(s => s.Id == id) 
           .Select(s => new { s.Id, s.PropIWantToShow }); 

db - это наш контекст данных Entity Framework.Возврат Выбранные свойства одного объекта в методе EF Синтаксис

Моя цель - выбрать одну запись, соответствующую предоставленному id в ExampleTable. Если запись не найдена, она должна вернуть значение null. Однако EF, похоже, не позволяет мне выбрать один объект, а затем возвращать только определенные свойства. Как это сделать или это первый пример, который я дал правильно?

я проверить этот вопрос: select properties of entity ef linq:

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

Но ответ просто не кажется правильным, но, очевидно, «кажется» является очень слабым утверждением.

+1

Выбор FIrst достаточно хорош, за исключением объявления переменной как объекта. Вам лучше использовать 'var' для анонимных типов –

+1

. Ваша проблема заключается в том, что' SingleOrDefault' возвращает элемент, а не 'IEnumerable', поэтому вы не можете использовать LINQ против него. – Jonesopolis

+1

. Как вы думаете, что неправильно с первой частью кода? –

ответ

1

Ваш первый метод является правильным:

//This works, but seems incorrect to me 
    Object selection = db.ExampleTable 
         .Where(s => s.Id == id) 
         .Select(s => new { s.Id, s.PropIWantToShow }) 
         .SingleOrDefault(); 

Ваш второй метод получает вас один объект, а не IQueryable<T> объекта, который LINQ будет работать. Если вы хотите конвертировать из одного типа объекта в другой, это не предмет LINQ. Вы все еще можете, но это будет более запутанным. Что-то вроде:

var selection =...; 
var newselection=new { Id=selection.Id, PropIWantToShow=selection.PropIWantToShow }; 

, но это очень плохо, потому что вы ДЕЙСТВИТЕЛЬНО получить весь объект из БД, а потом просто выбросили большую часть. Ваш первый метод возвращает только 2 поля из БД.

0

Если вы хотите, чтобы ваша функция возвращала значение null, если условие не соответствует, используйте FirstorDefault() вместо SingleorDefalut(). Поэтому, если вы хотите совместить идентификатор и вернуть объект, выполните следующие действия:

return db.ExampleTable.FirstorDefault(c=>c.Id == id); 
+0

Ух ... почему бы вам сказать что-то вроде этого? SingleOrDefault() wil Я все еще возвращаю значение null, когда объект не соответствует условию.Единственное различие между двумя вызовами заключается в том, что SingleOrDefault() будет генерировать (ожидаемое) исключение, если имеется несколько элементов, соответствующих условию. EDIT: после некоторого разума есть еще одна разница между двумя вызовами: FirstOrDefault будет выполняться только через таблицу, пока элемент не будет найден, а затем вернется, SingleOrDefault будет проходить через таблицу до тех пор, пока не будет найден второй элемент. – DevilSuichiro

+0

Да, я точно знаю об этом. –

Смежные вопросы