EF core. Любой не фильтрует результаты - PullRequest
0 голосов
/ 13 января 2020

У меня есть следующее sql, которое я пытаюсь перевести на linq:

SELECT *
  FROM [Service] s
  inner join vendor  v on vendorid=v.id
  inner join VendorLocation vl on vl.VendorId=v.id
  where s.active=1 and v.active=1 and vl.City = 'toronto' and vl.Active=1

У меня есть Служба, принадлежащая Продавцу, а у Продавца есть Местоположения. Я пытаюсь отфильтровать местоположения по городу, но запрос возвращает результаты, которые не удовлетворяют условиям в предложении ".Any"

 var service = await _context.Service
                .Where(s => s.Active && s.Vendor.Active)
                .Include(s => s.Vendor)
                    .ThenInclude(s => s.VendorLocations)
                         .Where(s => s.Vendor.VendorLocations.Any(l => l.City == City && l.Active))
                .ToListAsync();

Оператор sql возвращает правильные результаты, но linq нет.
Любая помощь приветствуется, спасибо! Бен

Ответы [ 3 ]

1 голос
/ 13 января 2020

Вы можете попробовать с примечанием запроса:

var query = from v in _context.Vendors 
            join s in v.Services on v.Id equals s.VendorId
            join l in v.ServiceLocations on v.Id equals l.VendorId
            where v.Active && s.Active && l.City=="Toronto"
            select new {v,s,l};

var result= await query.ToLinqAsync();
0 голосов
/ 13 января 2020

запрос возвращает результаты, которые не удовлетворяют условиям в предложении ".Any"

Эти запросы просто не совпадают. SQL Запрос возвращает одну строку на VendorLocation с дополнительными столбцами из соединенных таблиц и проецирует все столбцы.

SELECT *
  FROM [Service] s
  inner join vendor  v on vendorid=v.id
  inner join VendorLocation vl on vl.VendorId=v.id
  where s.active=1 and v.active=1 and vl.City = 'toronto' and vl.Active=1

В LINQ это будет что-то вроде

from vl in VendorLocation
where vl.Vendor.Active 
   && vl.Vendor.Service.Active 
   && vl.Active
   && vl.City = 'toronto'
select new
{
   ServiceName = vl.Vendor.Service.Name,
   ServiceDescription = vl.Vendor.Service.Description,
   . . .
   VendorName = vl.Vendor.Name, 
   VendorWhatever = vl.Vendor.Whatever, 
   . . .
   vl.Name,
   . . . 
};
0 голосов
/ 13 января 2020

Здравствуйте, вы используете EF Core сейчас, но я предлагаю использовать LINQ , потому что это самое простое. Пожалуйста, прочитайте эту страницу , чтобы узнать больше, и это пример кода

var innerGroupJoinQuery2 =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID into prodGroup
    from prod2 in prodGroup
    where prod2.UnitPrice > 2.50M
    select prod2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...