Синтаксис LINQ для многих ко многим - PullRequest
0 голосов
/ 13 апреля 2011

Я немного боролся с LINQ и был после помощи.Я мог бы сделать это в SQL, но не могу понять, как в LINQ.У меня есть база данных SQL Compact 4.0 с EDMX Entity Framework 4.0, моделирующей ее, в C #.

Это сценарий, эти таблицы:
Клиенты - OrderDetails - Orders

OrderDetailstable - таблица не-полезных данных, просто облегчающая соединение многих ко многим.

Если мне в качестве параметра указан номер CustomerId, я хочу вернуть IEnumerable<Orders>.

InSQL Я бы написал это так:

SELECT     Orders.*  
FROM         OrderDetails INNER JOIN  
                  Orders ON OrderDetails.OrderId = Orders.OrderId INNER JOIN  
                  Customers ON OrderDetails.CustomerId = Customers.CustomerId

Как я могу сделать это в LINQ?

Ответы [ 4 ]

2 голосов
/ 13 апреля 2011

Если вы хотите «мыслить в SQL», вы можете сделать это как выражение запроса:

int customerId = ...;
var query = from detail in OrderDetails
            where detail.CustomerId == customerId
            join order in Orders on detail.OrderId equals order.OrderId
            select order;

Обратите внимание, что это вообще не касается таблицы «Клиенты» ... Я предполагаю, что существует достаточно реляционных ограничений, чтобы гарантировать, что OrderDetails.CustomerId действительно ссылается на реального клиента.

Если у вас все отношения настроены надлежащим образом, вы можете использовать что-то вроде ответа Шёрда. Обратите внимание, что сначала будет извлечена сущность Customer, а вышеупомянутый запрос - нет. Это более ОО-образный способ думать о вещах.

РЕДАКТИРОВАТЬ: Как представляется, ваши отношения настроены надлежащим образом, два варианта:

// This will involve checking the customer data first
var customer = db.Customers.SingleOrDefault(c => c.CustomerId == customerId);
if (customer != null)
{
    var orders = customer.Orders;
}

// This shouldn't... hopefully :) You'll end up with an empty sequence if
// the customer doesn't exist
var orders = db.Customers.Where(c => c.CustomerId == customerId)
                         .SelectMany(c => c.Orders);
0 голосов
/ 13 апреля 2011

Если вы хотите, чтобы все заказы имели хотя бы одного клиента с идентификатором customerId, вы также можете попробовать это:

var orders = context.Orders
    .Where(o => o.Customers.Any(c => c.CustomerId == customerId)).ToList();

Мне кажется несколько странным, что в одном заказе может быть много клиентов, но я так понимаю ваше описание: «Клиенты - OrderDetails - Заказы ... Таблица OrderDetails - это таблица без полезной нагрузки, которая упрощает объединение многих со многими». . "

Я ожидаю, что Order в вашей EntityModel имеет коллекцию навигации Customers, а OrderDetails - это только внутренняя таблица соединений, не существующая как сущность.

0 голосов
/ 13 апреля 2011

Я думаю, что это может сработать:

int customerId = ...;
var query = Customers.Include("Orders").Where(cust => cust.CustomerID == customerId)
0 голосов
/ 13 апреля 2011

Примерно так:

Customer customer = DataContext.Customers.Single(c => c.Id == CustomerId);
IEnumberable<Order> orders = customer.OrderDetails.Orders;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...