Как добавить в набор сущностей linq2sql для основной детали, если я не могу явно определить детали?
Может быть, я иду по этому пути неправильно...
У меня есть таблица Order и таблица OrderItem. Я создаю новый Order, используя сгенерированные классы 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?
Заранее спасибо за помощь.
2 ответа
Из моего понимания 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 });
Попробуйте и дайте мне знать, если это поможет.
Разверните класс заказов, создав частичный файл, в котором этот класс OrderItem теперь имеет свойство (свойства), которое поддается потребностям бизнес-логики, но не требует сохранения в базе данных.
public partial class OrderItem
{
public int JoinedOrderItemId { get; set; }
public bool HasBeenProcessed { get; set; }
}