Как добавить в набор сущностей 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; }

}
Другие вопросы по тегам