LINQ to Entities - предложение WHERE об исключении Частично отгруженных заказов в моем примере - PullRequest
2 голосов
/ 17 января 2012

У меня есть стол заказов. Заказ может содержать несколько элементов, каждый из которых доставляется в разное время. Я хочу получить список всех заказов, которые исключают частично отправленных или заказов. Другими словами, мне нужно получить список всех заказов, которые полностью отправлены. Я могу знать, как это сделать в T-SQL. Но я пытаюсь сделать это с помощью LINQ-to-Entities (EF4 / .Net 4.0 / C #).

Рассмотрим следующие данные:

PK      OrderID      Item       Status
1       00001        TV         Shipped
2       00001        TABLET     Shipped
3       00002        BLURAYPL   Not Shipped
4       00002        MOBILEPH   Shipped
5       00002        XBOX       Shipped
6       00003        PAPER      Shipped
7       00003        PENCIL     Shipped

Цель состоит в том, чтобы получить 00001 и 00003 в качестве выходных данных.

Вот то, что я до сих пор явно упростил:

using (MyDBEntities dbcontext = new MyDBEntities())
{
  var WashingtonClients = from a in dbcontext.CustomerMasterTable
                    where a.City == "Washington"
                    select a.CustomerID;

 var ShippedOrdersToWashingtonClients = from o in dbcontext.OrderDetail
                     where WashingtonClients.Contains(o.CustomerID)
                     && o.Status.ToUpper() == "SHIPPED"
                     //how to exclude Partially Shipped orders here???
                     select o.OrderID;
}

Как оформить второй запрос таким образом, чтобы он исключал заказы, в которых есть хотя бы один не отгруженный элемент? Большое спасибо за ваше время.

1 Ответ

3 голосов
/ 17 января 2012

Предположим, у вас есть поддельный список с вашими данными:

var orderDetails = new List<OrderDetail>
    {
        new OrderDetail{ ID = 1, Item = "TV", OrderID = "00001", Status = "Shipped"},
        new OrderDetail{ ID = 2, Item = "TABLET", OrderID = "00001", Status = "Shipped"},
        new OrderDetail{ ID = 3, Item = "BLURAYPL", OrderID = "00002", Status = "NotShipped"},
        new OrderDetail{ ID = 4, Item = "MOBILEPH", OrderID = "00002", Status = "Shipped"},
        new OrderDetail{ ID = 5, Item = "XBOX", OrderID = "00002", Status = "Shipped"},
        new OrderDetail{ ID = 6, Item = "PAPER", OrderID = "00003", Status = "Shipped"},
        new OrderDetail{ ID = 7, Item = "PENCIL", OrderID = "00003", Status = "Shipped"}
    };

Тогда ваш запрос linq должен выглядеть следующим образом:

var result = orderDetails
    .GroupBy(o => o.OrderID)
    .Where(g => g.All(i => i.Status == "Shipped"))
    .Select(g => g.Key);

так что вы получите пару строк - "00001" and "00003" в результате.

Следовательно, для реального запроса к БД вы можете написать что-то вроде этого:

dbContext.OrderDetails
    .Where(o => WashingtonClients.Contains(o.CustomerID))
    .GroupBy(o => o.OrderID)
    .Where(g => g.All(i => i.Status == "Shipped"))
    .Select(g => g.Key);
...