При попытке получить полукомплексный запрос для отображения некоторого содержимого 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)
ОК, это тонко, но что, если вы меняете запрос 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.
Manufacturer
, поэтому я должен пройти мимо запроса на соединение ... здесь нет выбора
Самый вероятный виновник:
select new { ContactID = m.ID, ContactName = m.Name }
Это связано с тем, что анонимные типы не имеют конструкторов без параметров. Что странно в том, что анонимные типы являются более строгими в LINQ to Entities. Я просто не вижу никакой другой линии, которая могла бы обидеть.
Сначала попробуйте удалить эту строку и посмотреть, не исчезла ли ошибка. По крайней мере, мы узнаем, это или нет. Затем мы можем сосредоточиться на выяснении причин.
Изменить: Каковы типы OrderSet.ID
, Product.ID
и Order.ID
и ContactSet.ID
? Кто-нибудь из них Guid
и неявно называется конструктором Guid
?
Сначала конвертируйте в список, затем вызовите оператор select
:
var res = abc.getEmployess().toList().select(x => new keyvaluepair<int, string>(x.EmpID, x.EmpName.tostring)).tolist();
products
memberOrderDetails.Any
ли проблема, если вы удалитеmemberOrderDetails.Any
иinventoryItems.Any
?