LINQ to SQL SubSelect Like Query

时间:2009-06-05 11:53:21

标签: linq-to-sql strong-typing

想象有两张桌子。

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

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

订单可以有多个OrderStatus,可以称为OrderStatusHistory。 我将有一个StronglyTypeObject 订单,其描述如下

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

订单对象中的这个StatusId意味着来自OrderStatus表的当前(最后)StatusId。

我尝试使用LINQ构建一个IQueryable对象列表。这是我的,不工作;),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
             }

我也尝试过使用Max(p => p.XXX),但还没有解决。 有没有人对这个问题有所暗示?

非常感谢任何帮助...

戈登

2 个答案:

答案 0 :(得分: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的部分类中,以便您可以将其称为。<​​/ p>

var currentStatus = order.CurrentStatus;

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

答案 1 :(得分: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()
         }