Sobes.tech
Middle

Чӣ гуна истифода бурдани оператори join дар Entity Framework?

sobes.tech AI

Ҷавоб аз AI

Дар Entity Framework (EF), оператори JOIN иҷро мешавад тавассути якҷоя кардани методҳои LINQ Join ё SelectMany, инчунин бо истифода аз хосиятҳои навигатсионӣ.

  1. Истифодаи хосиятҳои навигатсионӣ: Роҳи маъмул ва тавсияшуда, агар байни объектҳо муносибатҳо танзим карда шудаанд. EF автоматӣ пурсишҳои SQL-ро бо JOIN мебарорад.

    // Мисол: Ҳамагон фармоишҳоро бо маълумоти муштарӣ гирифтан
    var ordersWithCustomers = context.Orders
        .Where(o => o.Customer != null) // Санҷиши мавҷудияти муштарӣ
        .Select(o => new
        {
            OrderId = o.Id,
            OrderDate = o.OrderDate,
            CustomerName = o.Customer.Name
        })
        .ToList();
    
  2. LINQ Join: Барои пайваст кардани ду коллексия бо истифода аз майдонҳои мувофиқ, монанди SQL INNER JOIN.

    // Мисол: Пайваст кардани Orders ва Customers
    var ordersAndCustomers = context.Orders
        .Join(context.Customers, // Коллексияи дуввум
              order => order.CustomerId, // Ключ аз аввал
              customer => customer.Id, // Ключ аз дуввум
              (order, customer) => new // Натиҷаи пайваст
              {
                  OrderId = order.Id,
                  OrderDate = order.OrderDate,
                  CustomerName = customer.Name
              })
        .ToList();
    
  3. LINQ GroupJoin: Монанд ба SQL LEFT JOIN, ки элементҳои коллексияи дуввумро барои ҳар як элементи аввал гурӯҳбандӣ мекунад.

    // Мисол: Ҳамагон муштариён ва фармоишҳояшон
    var customersWithOrders = context.Customers
        .GroupJoin(context.Orders, // Коллексия барои пайваст кардан
                   customer => customer.Id, // Ключи муштарӣ
                   order => order.CustomerId, // Ключи фармоиш
                   (customer, orders) => new // Натиҷаи гурӯҳбандӣ
                   {
                       CustomerName = customer.Name,
                       Orders = orders.Select(o => new { o.Id, o.OrderDate }).ToList()
                   })
        .ToList();
    
  4. LINQ SelectMany: Барои имитация кардани CROSS JOIN ё сохтани маҷмӯаҳои элементҳо аз ду коллексия истифода мешавад. Дар якҷоягӣ бо Where метавонад ҳамчун INNER JOIN кор кунад.

    // Мисол: Ҳамагон ҷуфтҳо муштарӣ-фармоиш
    var crossJoinExample = context.Customers
        .SelectMany(customer => context.Orders, // Ба ҳар муштарӣ ҳамаи фармоишҳоро пайваст мекунад
                    (customer, order) => new // Натиҷа
                    {
                        CustomerName = customer.Name,
                        OrderId = order.Id
                    })
        .ToList();
    
    // Мисол: Имитация кардани Inner Join бо SelectMany ва Where
    var innerJoinWithSelectMany = context.Customers
        .SelectMany(customer => context.Orders, // Ба ҳар муштарӣ ҳар фармоиш пайваст мешавад
                    (customer, order) => new // Натиҷаи гузариш
                    {
                        Customer = customer,
                        Order = order
                    })
        .Where(pair => pair.Customer.Id == pair.Order.CustomerId) // Филтр based on matching keys
        .Select(pair => new // Натиҷаи ниҳоӣ
                {
                    CustomerName = pair.Customer.Name,
                    OrderId = pair.Order.Id
                })
        .ToList();
    

Интихоби усул аз вазифаи мушаххас ва сохтори маълумотҳо вобаста аст. Хосиятҳои навигатсионӣ барои кор бо муносибатҳои аллакай дар модели EF муайяншуда, афзалият доранд. Join ва GroupJoin ошкоро барои ҳолатҳои мураккабтар барои пайваст кардани коллексияҳо бештар флексибл мебошанд. SelectMany барои ҳолатҳои ғайриоддӣ бештар истифода мешавад.