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