Создание объекта с вложенным списком объектов с помощью LINQ to Entities - PullRequest
1 голос
/ 23 января 2012

Я пытаюсь создать объект, содержащий список объектов, используя Linq to Entity Framework. Но я получаю исключение NotSupported. Моя структура БД очень похожа на БД, которая поставляется с LinqPad. Возьмем, к примеру, это - у меня есть доменный объект customer и доменный объект Purchase (или для ex-Order).

Public Class Customer (){ long CustID ,string CustName , List<Purchase> purchases }
Public Class Purchase () { long PurchaseID}

Я пытаюсь заполнить объект домена клиента в DAL, используя такие свойства навигации, как это -

db.Customer
.Where( t=> t.CustID==1)  //hard coding for 1
.Select( t=> new Customer()
{
CustName = t.name ,
Purchases = t.Customer.Purchase
        .Select ( p=> new Purchase()
            {
                PurchaseID=p.purchaseid
}).ToList()
});

Я получил исключение NotSpported для этого

Я также пытался создать метод для purchases – GetPurchases(). Он возвращает список покупок и присваивает его объекту клиента, который я создаю. Но я все еще получаю то же исключение. Я получаю NotSuuported исключение с сообщением об ошибке -

не может преобразовать метод для хранения выражения

. Я искал и кажется, что поддерживается в linq to sql, но не в linq to ef Я пытаюсь сделать то же самое, что и этот пост - Использование linq для возврата объекта со списком member Можно ли заполнить объект домена, как я делаю. Есть ли известные решения или обходные пути для этого.

Ответы [ 3 ]

2 голосов
/ 27 мая 2016

Вот рабочий пример чего-то подобного.В этом случае заполняется вложенная коллекция Taxes.

public async Task<IEnumerable<ServiceLayer.DTO.Vendor>> GetAllVendors()
{
    return await (

        from vendor in _db.Vendors

        select new ServiceLayer.DTO.Vendor()
        {
            Id = vendor.Id,
            Name = vendor.Name,
            Taxes = (from tax in _db.VendorTaxes
                     where tax.VendorId.Equals(vendor.Id)
                     select new DTO.VendorTax() { Id = tax.Id, Rate = tax.Rate })
        })

    .ToListAsync();
}
0 голосов
/ 26 января 2012

Вы не можете создать экземпляр вашей модели в выражении Select. Select предназначен для создания объектов с «выбранными» свойствами / столбцами - анонимными объектами или (например) представлениями моделей или объектов передачи данных.

То, что вы пытаетесь загрузить (объект, включающий свойства навигации), обычно выполняется с энергичной загрузкой:

var customer = db.Customer.Include("Purchases")
    .SingleOrDefault(c => c.CustID == 1);

Как правило, вы также не можете использовать свои собственные методы (например, GetPurchases()) в запросе LINQ to Entities. Есть только несколько исключений - например, методы расширения IQueryable<T> или методы, которые возвращают Expression<Func<T>>. В большинстве случаев Entity Framework не может преобразовать такой пользовательский метод в «выражение магазина» на языке, который понимает ваша база данных (например, = SQL).

0 голосов
/ 24 января 2012

Он не может преобразовать:

.Select ( p=> new Purchase()
            {
                PurchaseID=p.purchaseid
})

в правильный оператор SQL, фактически он создает дерево выражений, но не может преобразовать его в команду SQL, вы можете сделать что-то вроде этого:

db.Customer
.Where( t=> t.CustID==1)  //hard coding for 1
.Select( t=> new Customer()
{
CustName = t.name ,
Purchases = t.Customer.Purchase
        .Select ( p=> p.purchaseid)
        .ToList() // here you should fetch your data from DB

        // now convert fetched data via linq2object to what you want:
        .Select( p => new Purchase()
            {
                PurchaseID=p.purchaseid
            })
        .ToList();

Редактировать: Извините, я не увидел ваш первый оператор выбора:

Select( t=> new Customer()
{
 CustName = t.name ,
 Purchases = t.Customer.Purchase...
}

linq2entity Также не могу справиться с этим (фактически любая сложная инициализация)

Но, как я вижу, кажется, у вас есть только один клиент, так почему вы не получили его полностью?на самом деле так:

var customer = db.Customer.FirstOrDefault(x=>x.ID == 1)

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...