SQL в Entity Framework с использованием «In» - PullRequest
0 голосов
/ 21 января 2020

У меня есть приложение ASP. NET MVC, использующее EF в C#. Я могу правильно написать и выполнить свой запрос на сервере SQL. В EF я не уверен, как выполнить sh то же самое.

Таблицы A, B и C. C ссылается на B, на который ссылается A.

Запрос выглядит так:

Select * 
From C
Where C.bID in (Select B.bID 
                From B
                Where B.aID = '<unique Key In A>')

Подзапрос возвращает несколько ключей B. Который затем передает это и ищет ID в C. Короче говоря, я просматриваю все данные в C, связанные с ключом в A.

Я просто не знаю, как перевести это на язык EF. Или, если это вообще возможно. Оператор IN - это то, что бросает меня на преобразование.

Пример:

  var exampleList = _context.C
                        .Where(l => l.bId in (_context.B
                        .Where(p => p.aId = keyInA)));

"in" здесь не работает. Очевидно. После того, как я написал этот пост, я в этом убедился.

Примечание: A: B имеет отношение 1: много. B: C имеет отношение 1 ко многим. Все идентификаторы и ключи являются GUID

1 Ответ

0 голосов
/ 22 января 2020

Установите свойство навигации между C & B и между A & B. В этом и заключается весь смысл использования Entity Framework, а не просто альтернатива запросам ADO и SQL.

C содержит BId, поэтому настройте свойство навигации B:

public class C
{
    public int CId { get; set; } 
    [ForeignKey("B")]
    public int BId { get; set; }
    public virtual B B { get; set; }
}

B содержит AId, аналогично:

public class B
{ 
    public int BId { get; set; }
    [ForeignKey("A")]
    public int AId { get; set; }
    public virtual A A { get; set; }
}

Теперь, чтобы написать запрос:

var cs = context.Cs.Where(x => x.B.AId == id);

или

var cs = context.Cs.Where(x => x.B.A.AId == id); // can filter on other "A" fields this way.

Я имею в виду, чтобы избежать использования свойств навигации, вы можете просто написать Sprocs и использовать ADO. Это возможно в тех случаях, когда у вас есть несвязанные таблицы или вам абсолютно необходимо избегать свойства навигации. Используйте Join между context.Cs и context.Bs:

var cs = context.Cs.Join(context.Bs, c => c.BId, b => b.BId, (c, b) => new { C = c, AId = b.AId })
                .Where(x => x.AId == aid)
                .Select(x => x.C);

IMO серьезно уродливая работа с объединениями в EF, но иногда это необходимо. Если вы можете использовать свойство навигации, я настоятельно рекомендую использовать его регулярно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...