2013-05-14 61 views
0

我試圖生成一個網格,最終用戶可以使用多個輸入過濾數據。嘗試過濾LINQ查詢時的枚舉類型異常

要做到這一點,我試圖篩選初始LINQ到實體對象,如下所示:

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#的問題,但不幸的是不能讓它去w/VB。

回答

1

這是在您的Linq Expression中關閉中捕獲的問題。

在英語中,這意味着您正嘗試將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,他們會告訴你兩者是非常不同的,因爲我已經將Linq Expression中的CLng(cboProperty.EditValue)轉換爲函數調用。

就我個人而言,我對Lambda表達式與Lambda函數的語法如何具有相同的語法有兩個想法,導致了這些例外。

BTW我更喜歡我查詢這種形式...

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

完美,像一個魅力工作! :) – 2013-05-14 16:22:45