3

想象有两张桌子。

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

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

一个 Order 可以有多个 OrderStatus,可以称为 OrderStatusHistory。我会有一个 StronglyTypeObject Order,描述如下

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

Order 对象中的这个 StatusId 是 OrderStatus 表中的当前(最后一个)StatusId。

我试图用 LINQ 构建一个 IQueryable 对象列表。这是我的,不工作;),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=>p.XXX),但没有成功。有人对这个问题有提示吗?

任何帮助将非常感激...

戈登

4

2 回答 2

2

根据您的评论,我已更新以下内容以使用 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;
         }
     }
}
于 2009-06-05T12:09:18.123 回答
1

好吧,这个怎么样:(取两个,降序并取第一个.. 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()
         }
于 2009-06-05T12:00:42.010 回答