В LINQ to Entities поддерживаются только конструкторы и инициализаторы без параметров

2

При попытке получить полукомплексный запрос для отображения некоторого содержимого ListView на странице я застрял на знаменитом "Только параметрический контрструктор и инициализаторы поддерживаются в LINQ to Entities".

Вот код, который я использовал... Я не могу найти место, где я инициализировал что-то внутри запроса с параметрами....

protected void ArtistsList()
{
    Guid cat1 = new Guid("916ec8ae-8336-43b1-87c0-8536b2676560");
    Guid cat2 = new Guid("92f2a07f-0570-4521-870a-bf898d1e92d6");

    var memberOrders = (from o in DataContext.OrderSet
                        where o.Status == 1 || o.Status == 0
                        select o.ID);

    var memberOrderDetails = (from o in DataContext.OrderDetailSet
                              where memberOrders.Any(f => f == o.Order.ID)
                              select o.Product.ID );

    var inventoryItems = (from i in DataContext.InventoryItemSet
                          select i.Inventory.Product.ID);

    var products = (from p in DataContext.ProductSet
                    join m in DataContext.ContactSet on p.ManufacturerID equals m.ID
                    where p.Active == true
                       && p.ShowOnWebSite == true
                       && p.Category.ID != cat1
                       && p.Category.ID != cat2
                       && p.AvailableDate <= DateTime.Today
                       && (p.DiscontinuationDate == null || p.DiscontinuationDate >= DateTime.Today)
                       && memberOrderDetails.Any(f => f != p.ID)
                       && inventoryItems.Any(f => f == p.ID)
                    select new { ContactID = m.ID, ContactName = m.Name });

    artistsRepeater.DataSource = products;
    artistsRepeater.DataBind();

    Response.Write("PRODUCT COUNT: " + products.Count());
}

Сама ошибка появляется по строке artistsRepeater.DataSource = products;

Я попытался прокомментировать строки && memberOrderDetails.Any(f => f != p.ID) и && inventoryItems.Any(f => f == p.ID), все еще ничего не меняя

Любые подсказки?

[править]

С LINQpad он работает с соединением, но с ним прослушивается прокомментированная строка

(from p in Products
join m in Members on p.ManufacturerID.Value equals m.ID
where p.Active == true
&& p.ShowOnWebSite == true
&& p.AvailableDate <= DateTime.Today
&& (p.DiscontinuationDate == null || p.DiscontinuationDate >= DateTime.Today)
//&& (from od in MemberOrderDetails where (from mo in MemberOrders where mo.Status == 1 || mo.Status == 0 select mo.ID).Any(f => f == od.ID) select od.Product.ID)
&& (from inv in InventoryItems select inv.Inventory.ProductID).Any(i => i.Value == p.ID)
select m).Distinct()

[править-2]

Кажется, что этот запрос в LINQpad в порядке:

(from p in Products
join m in Members on p.ManufacturerID.Value equals m.ID
where p.Active == true
&& p.ShowOnWebSite == true
&& p.AvailableDate <= DateTime.Today
&& (p.DiscontinuationDate == null || p.DiscontinuationDate >= DateTime.Today)
&& !(from od in MemberOrderDetails where (from mo in MemberOrders where mo.Status == 1 || mo.Status == 0 select mo).Any(f => f.ID == od.ID) select od.Product.ID).Any(i => i == p.ID)
&& (from inv in InventoryItems select inv.Inventory.ProductID).Any(i => i.Value == p.ID) 
select m)
  • 0
    помог бы узнать, какой из запросов выдает ошибку, хотя я подозреваю, что его products
  • 0
    memberOrderDetails.Any ли проблема, если вы удалите memberOrderDetails.Any и inventoryItems.Any ?
Показать ещё 21 комментарий
Теги:
linq
entity-framework
linq-to-entities

3 ответа

1
Лучший ответ

ОК, это тонко, но что, если вы меняете запрос LINQPad из:

           (from p in Products
            join m in Members 
                on p.ManufacturerID.Value equals m.ID
            where p.Active == true
                && p.ShowOnWebSite == true
                && p.AvailableDate <= DateTime.Today
                && (p.DiscontinuationDate == null || p.DiscontinuationDate >= DateTime.Today)
                && (from od in MemberOrderDetails 
                    where (from mo in MemberOrders 
                           where mo.Status == 1 || mo.Status == 0 
                           select mo.ID).Any(f => f == od.ID) 
                    select od.Product.ID)
                && (from inv in InventoryItems 
                    select inv.Inventory.ProductID).Any(i => i.Value == p.ID)

... в:

           (from p in Products
            join m in Members 
                on p.ManufacturerID.Value equals m.ID
            where p.Active == true
                && p.ShowOnWebSite == true
                && p.AvailableDate <= DateTime.Today
                && (p.DiscontinuationDate == null || p.DiscontinuationDate >= DateTime.Today)
                && (from od in MemberOrderDetails 
                    where (from mo in MemberOrders 
                           where mo.Status == 1 || mo.Status == 0 
                           select mo).Any(f => f.ID == od.ID)          // NOTE!
                    select od.Product.ID)
                && (from inv in InventoryItems 
                    select inv.Inventory.ProductID).Any(i => i.Value == p.ID)

Почему? Я думаю, что вывод типа может быть неправильным здесь. Я видел аналогичную вещь с DateTime s.

  • 0
    В классе ProductSet нет свойств Manufacturer , поэтому я должен пройти мимо запроса на соединение ... здесь нет выбора
  • 0
    ОК, попробуйте изменить. Я бы исправил это недостающее свойство. :)
Показать ещё 9 комментариев
1

Самый вероятный виновник:

select new { ContactID = m.ID, ContactName = m.Name }

Это связано с тем, что анонимные типы не имеют конструкторов без параметров. Что странно в том, что анонимные типы являются более строгими в LINQ to Entities. Я просто не вижу никакой другой линии, которая могла бы обидеть.

Сначала попробуйте удалить эту строку и посмотреть, не исчезла ли ошибка. По крайней мере, мы узнаем, это или нет. Затем мы можем сосредоточиться на выяснении причин.

Изменить: Каковы типы OrderSet.ID, Product.ID и Order.ID и ContactSet.ID? Кто-нибудь из них Guid и неявно называется конструктором Guid?

  • 0
    ну не совсем ... я пробовал только с "select m" и тоже не работал ...
  • 0
    Нет, это поддерживается в L2E
Показать ещё 8 комментариев
0

Сначала конвертируйте в список, затем вызовите оператор select:

var res = abc.getEmployess().toList().select(x => new keyvaluepair<int, string>(x.EmpID, x.EmpName.tostring)).tolist();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню