#c# #entity-framework #linq
#c# #entity-framework #linq
Вопрос:
В настоящее время у меня есть три таких запроса:
var query1 = (from a in dbContext.Table1
where a.email == someEmail
select a.Table1K).ToList();
var query2 = (from a in dbContext.Table2
where a.emailAddrerss == someEmail
select a.Table2K).ToList();
var query3 = (from a in dbContext.Table3
where a.email == someEmail
select a.Table3K).ToList();
if ( query2.Any() || query3.Any() )
{
return false;
}
if(query1.Count == 1 )
{
var x = query1[0];
// do some stuff with that x value ...
}
Есть ли способ, например, с помощью внешних соединений (я не очень хорошо разбираюсь во внешних соединениях), чтобы мы могли достичь этого одним запросом вместо трех запросов?
Комментарии:
1. Ну, на самом деле вы не объединяете таблицы, поэтому я не уверен, что это уместно. Вы могли бы встроить запросы 2 и 3 в предложение where , но, не зная, что оно возвращает после «do some stuff», трудно понять, будет ли это уместно.
2. @DStanley если запросы 2 или 3 возвращают что-либо, это плохо, мы просто возвращаем false и выходим
Ответ №1:
Я не думаю, что фактическое объединение подходит, но у вас есть несколько возможностей для улучшения:
- Не вызывайте
ToList
запросы 2 или 3, если вы просто хотите проверить какой-либо результат: -
Если вам нужен только один результат из запроса 1, вызовите
SingleOrDefault
вместоvar query1 = (from a in dbContext.Table1 where a.email == someEmail select a.Table1K); var query2 = (from a in dbContext.Table2 where a.emailAddrerss == someEmail select a.Table2K); var query3 = (from a in dbContext.Table3 where a.email == someEmail select a.Table3K); if ( query2.Any() || query3.Any() ) { return false; } var x = query1.SingleOrDefault(); if(x != null) { // do some stuff with that x value ... }