2013-05-14 2 views
0

Я пытаюсь создать сетку, которую конечные пользователи могут фильтровать данные, используя несколько входов.Исключение типа перечисления при попытке фильтрации запроса LINQ

Для этого я пытаюсь фильтровать начальную LINQ к Entities объекта следующим образом:

Dim servhist As IQueryable(Of servicesHistory) = db.servicesHistories 

If cboProperty.EditValue <> Nothing Then 
    servhist = servhist.Where(Function(p) p.propID = CLng(cboProperty.EditValue)) 
End If 

grdServHist.DataSource = servhist.ToList() 

Однако при попытке отфильтровать запрос, я получаю следующее сообщение об ошибке при попытке перечислить коллекцию : «Невозможно создать постоянное значение типа« System.Object ». В этом контексте поддерживаются только примитивные типы или типы перечислений».

Я нахожусь в убытке. Я сделал это без проблем с помощью C#, но, к сожалению, не могу заставить его пойти с VB.

ответ

1

Это проблема с захватом в закрытии в выражении Linq.

На английском языке это означает, что вы пытаетесь передать CLng(cboProperty.EditValue) в выражение Linq. Это законно. Однако, когда Linq to Entity Framework смотрит на это, он не может преобразовать это в SQL. Это выражение содержит:

  1. Класса .net (скорее всего, контроль WinForm я подозреваю)
  2. Вызова собственности на классе .net
  3. .NET, преобразование вызова в результате класса .net ,

Плохое Linq2EF не может понять, что это такое! Это, однако, будет работать.

Dim servhist As IQueryable(Of servicesHistory) = db.servicesHistories 

If cboProperty.EditValue <> Nothing Then 
    Dim editValue = CLng(cboProperty.EditValue) 
    servhist = servhist.Where(Function(p) p.propID = editValue) 
End If 

grdServHist.DataSource = servhist.ToList() 

Теперь это выглядит точно так же. Однако, если вы спросите Linq Ninja, они скажут вам, что они очень разные, так как я преобразовал CLng(cboProperty.EditValue) из выражения Linq в вызов функции.

Лично я в двух умах о том, как Лямбда-выражения имеют тот же синтаксис, что и лямбда-функции, что приводит к этим исключениям.

КСТАТИ Я предпочитаю, чтобы мои запросы в этой форме ...

Dim editValue = CLng(cboProperty.EditValue) 
Dim servhist As IQueryable(Of servicesHistory) = _ 
    db.servicesHistories.Where(Function(p) p.propID = editValue or editValue is Nothing) 
grdServHist.DataSource = servhist.ToList() 

Это позволяет затем реорганизовать IQueryable в скомпилированный запрос.

+0

Отлично, работал как очарование! :) –

Смежные вопросы