2009-06-05 1 views
3

Представьте, что есть две таблицы.LINQ To SQL SubSelect Like Query

Order 
+----------------+ 
| ID    | 
| Name   | 
+----------------+ 

OrderStatus 
+----------------+ 
| ID    | 
| OrderId  | 
| StatusId  | 
+----------------+ 

В заказе может быть более одного OrderStatus, который можно было бы назвать OrderStatusHistory. у меня будет StronglyTypeObject Order, который descripted следующим

namespace my.project 
{ 
    public class Order 
    { 
     Int64 OrderId { get; set; } 
     String Name { get; set; } 
     Int64 StatusId { get; set; } 
    } 
} 

Это StatusId в Object Order предназначается, чтобы быть текущая (последняя) StatusId из OrderStatus табл.

Я попытался создать IQueryable Список объектов с LINQ. Вот мой, не работает;), Linq код

var result = from r in dbContext.ORDER 
      select new Order 
      { 
       OrderId = r.ID, 
       Name = r.Name, 
       StatusId = dbContext.OrderStatus 
          .Where(p => p.OrderId == r.ID).Last().StatusId 
      } 

Я также пробовал работать с Max (р => p.XXX), но это не сработало. У кого-нибудь есть намек на эту проблему?

Любая помощь была бы оценена ...

Гордон

+0

Это иллюстрирует, почему я критиковал Linq и аналогичные решения ORM. Вот проблема, которая имеет широко известное и довольно простое решение на хорошо установленном языке. Чтобы получить некоторые теоретические преимущества, вы отказываетесь от реальной производительности. Получите ли вы выгоды от Linq перевешивают время, необходимое для изучения избыточного (и своеобразного) способа запроса данных? См. Http://stackoverflow.com/questions/458802/doesnt-linq-to-sql-miss-the-point-arent-orm-mappers-subsonic-etc-sub-opti для обсуждения. –

ответ

2

Based в вашем комментарии, я обновил ниже, чтобы использовать First, и в этом случае вам нужно будет сделать OrderByDescending по ключу, чтобы получить его в правильном порядке.

var result = from r in dbContext.ORDER 
     select new Order 
     { 
      OrderId = r.ID, 
      Name = r.Name, 
      StatusId = dbContext.OrderStatus 
         .Where(p => p.OrderId == r.ID) 
         .OrderByDescending(p => p.ID) 
         .First() 
         .StatusId 
     } 

Кроме того, если у вас есть отношения FK определено, оно должно быть намного проще, чтобы получить последний StatusID без создания промежуточного объекта. В этом случае, я думаю, вы можете использовать Last (если объекты предварительно загружены), так как вы будете делать LINQtoObjects, а не LINQToSQL. YMMV.

var currentStatus = order.OrderStatuses.Last().StatusId; 

Последние могут быть добавлены в качестве метода на разделяемый класс для заказа, так что вы можете обратиться к нему как.

var currentStatus = order.CurrentStatus; 

public partial class ORDER 
{ 
    public int64 CurrentStatus 
    { 
     get 
     { 
      return this.OrderStatuses.Last().StatusId; 
     } 
    } 
} 
+0

Спасибо за ваш ответ. Из логики запроса LINQ я написал это точно так же, как вы. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что оператор бросает исключение System.NotSupportedException. Queryoperator «Last» не поддерживается.То я не понимаю. – Gordon

+0

Хорошо, тогда OrderByDescending и используйте сначала вместо этого. Я обновлю. – tvanfosson

1

хорошо, как об этом: (взять два, убывающем порядке и принять первый .. сверху 1)

var result = from r in dbContext.ORDER 
     select new Order 
     { 
      OrderId = r.ID, 
      Name = r.Name, 
      StatusId = dbContext.OrderStatus 
           .Where(p => p.OrderId == r.ID) 
           .OrderByDescending(p => p.OrderID) 
           .Select(p => p.StatusId) 
           .FirstOrDefault() 
     } 
+0

Это аналогичный подход, который я использовал. он выбирает Max() StatusId из таблицы OrderStatus. Проблема в том, что OrderStatus может быть 1 = order_received, 2 = order_payed, 3 = order_shipped, 4 = order_changed. Итак, после того, как StatusId был установлен в 4, он изменится после некоторой работы продавцов с повторением оплаты повторения. В этом примере запрос всегда будет 4. Именно поэтому я использовал Last(), чтобы получить последний StatusID. – Gordon

+0

Это исключает исключение «System.NotSupportedException: QueryOperator« Last »не поддерживается». Есть идеи? – Gordon

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

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