2012-01-17 2 views
2

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

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

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; 
} 

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

ответ

3

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

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); 
+0

Возможно ли это с Синтаксис запросов? – FMFF

+1

№ 'Все' не имеет аналогового запроса. – WarHog

+0

Вы только что спасли меня от написания очень сложной хранимой процедуры. Большое спасибо. – FMFF

 Смежные вопросы

  • Нет связанных вопросов^_^