也许我会以错误的方式解决这个问题......
我有一个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是否有正确的策略来实现这一目标?
提前感谢您的帮助。
答案 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; }
}