Возможно объединение трех запросов в одно внешнее объединение

#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 ... 
    }