Linq to sql LINQ到SQL子选择类查询

Linq to sql LINQ到SQL子选择类查询,linq-to-sql,strong-typing,Linq To Sql,Strong Typing,假设有两张桌子 Order +----------------+ | ID | | Name | +----------------+ OrderStatus +----------------+ | ID | | OrderId | | StatusId | +----------------+ 一个订单可以有多个OrderStatus,可以称为OrderStatusHistory。 我将有一个S

假设有两张桌子

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; }
    }
}
Order对象中的此StatusId是OrderStatus表中的当前(最后一个)StatusId

我尝试用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=>p.XXX),但没有成功。 有人对这个问题有什么建议吗

任何帮助都将不胜感激

戈登

好的,这个怎么样:(拿两个,按降序,先拿第一个


根据您的评论,我已经更新了下面的以首先使用,在这种情况下,您需要按键降序来获得正确的顺序

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

这说明了为什么我一直批评Linq和类似的ORM解决方案。这是一个问题,它有一个广为人知且相当简单的解决方案,使用一种成熟的语言。为了获得一些理论上的好处,你放弃了真正的生产力。您从Linq获得的收益是否超过了学习冗余(和特殊)数据查询方法所需的时间?有关讨论,请参阅。这是我使用的类似方法。它从OrderStatus表中选择Max()StatusId。问题是,假设订单状态可以是1=订单已收到,2=订单已付款,3=订单已发货,4=订单已更改。因此,在StatusId设置为4后,在销售人员进行一些工作后,一旦重复支付更改,StatusId将再次更改为2。在示例中,查询将始终为我们提供4。这就是我使用Last()获取最新状态ID的原因。它引发异常“System.NotSupportedException:QueryOperator“Last”不受支持”。有什么想法吗?谢谢你非常有用的回答。从LINQ查询的逻辑来看,我写的和您写的完全一样。我现在遇到的问题是,该语句正在抛出System.NotSupportedException。不支持查询运算符“Last”。这就是我不明白的。好吧,然后按降序排列,先用。我会更新的。
var currentStatus = order.CurrentStatus;

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