2015-12-15 6 views
1

Я пытаюсь понять, можно ли получить одну строку из базы данных, используя структуру сущности, не возвращая все данные. Может быть, я недоразумение как EF работа, но я считаю его похожим на следующее:Получите одну строку, используя Entity Framework, не получая все данные

tbl1

Id | Name   | Place 
1 | Teressa Green | UK 
2 | Robin Banks | Germany 
3 | Liam Neeson | Canada 

Если я хочу Robin Banks Id сделать что-то похожее на

context.tbl1.where(obj => obj.name = "Robin Banks") 

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

Чтобы поставить мою проблему в одном предложении. Я пытаюсь избежать загрузки назад все строки, когда я просто хочу 1.

+3

* «это получает все данные из таблицы БД, а затем фильтрование вниз к одной строке» * нет , это не. Entity Framework построит запрос SELECT * FROM tbl1 WHERE name = 'Robin Banks' и передаст его на сервер базы данных, который выполнит его как обычный запрос и вернет соответствующие строки в Entity Framework. – Albireo

+1

Вы ошибаетесь. Он будет фильтроваться в базе данных не в памяти. –

+0

Он будет фильтроваться только в памяти, если вы делаете что-то вроде этого: 'context.tbl1.ToList(). Where (obj => obj.name =" Robin Banks ")'. Поскольку вы сначала загружаете все в память, а затем фильтруете данные с помощью оператора where(). Но, как это делается с вами, фильтр применяется к базе данных. – croxy

ответ

0

Эта линия не будет на самом деле выполнить что-либо в базе данных:

context.tbl1.Where(obj => obj.name == "Robin Banks") 

Это будет возвращать IEnumerable<tbl1>, который будет лениво оценен, когда вы приступите к его использованию. Для выполнения фактического запроса в базе данных вам необходимо выполнить перечисление на IEnumerable<tbl1> (например, foreach, .ToList() или .SingleOrDefault()). В этот момент EF преобразует ваше предложение Where() в фактический SQL и выполнит его в базе данных, возвращая указанные данные. Таким образом, он получит все данные, которые соответствуют вашему предикатуobj.name="Robin Banks". Он не получит все данные в tbl1, используя инструкцию SQL, а затем фильтрует результаты в .NET - это не так, как это работает.

Однако, вы можете сделать это (если вам нужно, но не рекомендуется почти 100% времени) на первом перечислении с .ToList():

context.tbl1.Where(obj => <some SQL evaluated expression>).ToList() 

И затем добавив дополнительный предикат на конце :

context.tbl1.Where(obj => <some SQL evaluated expression>).ToList().Where(obj => <some .NET evaluated expression>).ToList() 

Вы можете войти фактический SQL, вырабатываемый EF, выполнив следующие действия с контекстом:

context.Database.Log = Console.WriteLine; 

И убедитесь сами, что происходит под капотом.

+0

Спасибо, что это было действительно полезно! – Srb1313711

+0

@downvoter - прокомментировать? – theyetiman

+0

Дополнительная информация, этот код 'context.Database.Log = Console.WriteLine;' предназначен только для EF6. –

4

Я думаю, вам нужно использовать здесь SingleOrDefault

var result= db.yourtable 
      .SingleOrDefault(c=>c.Name== "Some Name"); 

Всякий раз, когда вы используете SingleOrDefault, вы четко указать, что запрос должен привести в самый единственный результат

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