2009-06-05 153 views
3

想象有两个表。LINQ到SQL SubSelect Like查询

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被descripted。

我试图用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 
      } 

我也试图与最大(P => 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进行讨论。 – 2009-06-05 12:08:50

回答

2

基础的在您的评论中,我更新了下面的内容以使用First,在这种情况下,您需要对关键字执行OrderByDescending以获得正确的顺序。另外,如果您定义了FK关系,那么在不创建中间对象的情况下获取最后一个StatusId应该会容易得多。在这种情况下,我认为你可以使用Last(如果对象是预加载的),因为你将要执行LINQtoObject,而不是LINQToSQL。因人而异。

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

好了,这个怎么样:(取两个,降序排列,并采取先..顶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

这是我使用的类似方法。它从OrderStatus表中选择Max()StatusId。问题是一个OrderStatus可以是 1 = order_received, 2 = order_payed, 3 = order_shipped, 4 = order_changed。 因此,在StatusId设置为4之后,一旦重复付款,销售人员的一些工作再次变为2后,它会更改。在这个例子中,Query将总是给我们4。这就是为什么我使用Last()来获取最新的StatusID。 – Gordon 2009-06-05 12:15:00

+0

抛出异常“System.NotSupportedException:QueryOperator”Last“不受支持”。有任何想法吗? – Gordon 2009-06-05 12:38:00