LINQ To SQL SubSelect Like Query - PullRequest
       20

LINQ To SQL SubSelect Like Query

3 голосов
/ 05 июня 2009

представьте, что есть две таблицы.

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

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

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

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

Этот StatusId в Объекте заказа должен быть текущим (последним) StatusId из таблицы OrderStatus.

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

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
             }

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

Любая помощь будет принята с благодарностью ...

Гордон

Ответы [ 2 ]

2 голосов
/ 05 июня 2009

Исходя из вашего комментария, я обновил ниже, чтобы использовать 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;

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

var currentStatus = order.CurrentStatus;

public partial class ORDER
{
     public int64 CurrentStatus
     {
         get
         {
             return this.OrderStatuses.Last().StatusId;
         }
     }
}
1 голос
/ 05 июня 2009

хорошо, как насчет этого: (возьмите два, уберите порядок и возьмите сначала .. top 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()
         }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...