0

也许我会以错误的方式解决这个问题......

我有一个 Order 表和一个 OrderItem 表。我使用 linq2sql 生成的类创建了一个新订单。

然后,我尝试使用针对各种表的查询从我的数据库中获取所有可订购的项目。

然后,我尝试从该查询中创建一个新的 OrderItem 列表,但是我无法显式创建该对象。

Explicit construction of entity type OrderItem in query is not allowed.

这是查询:

return (from im in dc.MasterItems
                    join c in dc.Categories
                      on im.CATEGORY equals c.CATEGORY1                      
                    select new OrderItem()
                    {
                        OrderItemId = im.ItemId
                    });

这个想法是在创建新订单时使用所有可订购项目填充数据库,然后将它们显示在网格中以进行更新。我正在获取该查询的结果并尝试AddRange使用Order.OrderItems

是否有使用 linq2sql 完成此任务的适当策略?

在此先感谢您的帮助。

4

2 回答 2

1

根据我对 L2S 的理解,我认为您不能在查询中使用显式构造(换句话说new SomeObj() { ... }),因为您还没有枚举结果。换句话说,查询刚刚构建,那么您应该如何执行此操作:

SELECT new OrderItem() FROM MasterItems im JOIN Categories c on c.CATEGORY1 = im.CATEGORY

这就是你想要做的,它不起作用,因为你不能返回 POCO(除非你以某种方式加入 OrderItem 并在OrderItem.*某处做)。最终,您要做的只是首先在查询中枚举集合(在 foreach 循环中或通过调用 ToList()),然后构建您的 OrderItem 对象。

var query = (from im in dc.MasterItems
                    join c in dc.Categories
                      on im.CATEGORY equals c.CATEGORY1                      
                    select new { MasterItem = im, Category = c});
List<OrderItem> returnItems = new List<OrderItem>();
foreach(var item in query)
{
    returnItems.Add(new OrderItem() { OrderItemId = item.MasterItem.ItemId });
}
return returnItems;

或者

return (from im in dc.MasterItems
                    join c in dc.Categories
                      on im.CATEGORY equals c.CATEGORY1                      
                    select new { MasterItem = im, Category = c})
    .ToList()
    .Select(tr => new OrderItem() { OrderItemId = tr.MasterItem.ItemId });

试试看,如果有帮助,请告诉我。

于 2012-05-15T19:33:15.720 回答
0

通过创建一个部分文件来扩展订单类,其中该类 OrderItem 现在具有适合业务逻辑需求的属性,但不需要保存到数据库中。

public partial class OrderItem 
{
   public int JoinedOrderItemId { get; set; }
   public bool HasBeenProcessed { get; set; }

}
于 2012-05-15T19:02:32.893 回答