想象有两张桌子。
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),但还没有解决。 有没有人对这个问题有所暗示?
非常感谢任何帮助...
戈登
答案 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()
}