Entity Framework Core Linq-запрос для фильтрации связанных объектов - PullRequest
0 голосов
/ 01 июня 2018

Я долго разбирался, как написать запрос на фильтрацию связанной сущности через Entity Framework Core при использовании Include, предположим, у меня есть два следующих класса:

public class Order
{
  public int OrderId {get; set;}
  public String CreatedBy{get; set;}
  public virtual Collection<OrderDetail> OrderDetails { get; set; } = new Collection<OrderDetail>();
}

public class OrderDetail
{
   public Int64? OrderDetailID { get; set; }
   public Int64? OrderID { get; set; }
   public string ProductName { get; set; }
}

, если я хочу найти все заказы, созданные "Jason", и детали заказа которых имеют название продукта, равное "Apple" , в sql это будет выглядеть так: Скрыть код копирования

SELECT *
FROM Orders O
INNER JOIN OrderDetail OD ON O.OrderId = OD.OrderId
WHERE O.CreationUser = 'Jason' and OD.ProductName = 'Apple'

Однако яне в состоянии понять, как написать, что с помощью EntityFramework что-то вроде ниже не будет работать:

 await DbContext.Set<Order>()
    .Include(p => p.OrderDetails)
    .Where(o => o.CreationUser == "Jason")
    .Where(o => o.OrderDetails.Where(od => od.ProductName == "Apple"));

Есть сценарии, подобные выше, Я знаю, как отфильтровать свойство с базовым классом сущностей, как Order inПриведенный выше пример, но я не знаю, как обращаться со связанной сущностью, используя Include / ThenInclude, например фильтрацию по OrderDetail.ProductName, Я много исследовал, но все еще не понял, поэтому в конце я должен использоватьВместо этого сохраните процедуру , что не рекомендуется большинством разработчиков.

Может быть, это может сделать linq sql?

Пожалуйста, помогите мне понятьи еще об этом!Большое спасибо всем, кто может поделиться своими знаниями!

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

@ Слава ответ выглядит правильно.Но я хочу расширить свой ответ.Если вы хотите использовать like в своем запросе, вы можете использовать метод EF.Functions.Like.Это дешевле с точки зрения памяти и обрабатывает сложные выражения.Вы можете использовать то же самое в вашем сценарии, также как и приведенный ниже код.В реляционных базах данных это обычно напрямую переводится в SQL.

var orders = (from O in context.Order
              join OD in context.OrderDetail on O.OrderId equals OD.OrderId
              where EF.Functions.Like(O.CreatedBy, "Jason") && EF.Functions.Like(OD.ProductName, "Apple")
              select order).Distinct().ToList();
0 голосов
/ 01 июня 2018

Вы можете просто перевести свой SQL-скрипт в linq:

var orders = (from O in context.Order
              join OD in context.OrderDetail on O.OrderId equals OD.OrderId
              where O.CreatedBy == "Jason" && OD.ProductName == "Apple"
              select order).Distinct().ToList();

//or this solution
orders = context.Set<Order>().Include(p => p.OrderDetails)
   .Where(x => x.CreatedBy == "Jason" && x.OrderDetails.Any(y => y.ProductName == "Apple"))
   .ToList();    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...