如果我不能明确定义细节,如何添加到主要细节的linq2sql实体集?

时间:2012-05-15 15:48:41

标签: c# linq linq-to-sql master-detail entityset

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

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

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

然后我尝试从该查询创建一个新的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是否有正确的策略来实现这一目标?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分: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;

OR

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

尝试一下,如果有帮助,请告诉我。

答案 1 :(得分:0)

通过创建一个部分文件来扩展订单类,其中该类OrderItem现在具有属性(ies),这些属性可以满足业务逻辑需求,但不需要保存到数据库中。

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

}