2014-07-22 92 views
3

實體字段在以下Where子句中未被識別。 VB錯了嗎?LINQ查詢中的Where子句在vb.net中無法識別?

Dim projects = context.projects 
       .OrderBy(Function(x) x.name) 
       .Select(Function(x) {x.id, x.name}) 
       .Where(Function(x) x.id <> sourceid) 

如果我關閉Where,它工作正常。另外,如果我翻轉WhereOrderByWhere是好的,但現在OrderBy失敗。

+0

什麼是確切的錯誤信息? –

+0

@DanPuzey - 無法解析符號「ID」 – xaisoft

回答

2

你可以請用下面的代碼片段來嘗試。

Dim projects = context.projects.Where(Function(x) x.id <> sourceid).OrderBy(Function(x) x.name).Select(Function(x) {x.id, x.name}) 
+0

這有效,我做錯了什麼? – xaisoft

+1

Where子句需要在select子句之前。 – bowlturner

+1

@bowlturner - 這只是一個VB.NET的東西?我最初在C#中使用它,它工作正常。 – xaisoft

3

試試這個:

Dim projects = context.projects 
           .OrderBy(Function(x) x.name) 
           .Select(Function(x) New With {x.id, x.name}) 
           .Where(Function(x) x.id <> sourceid) 

New With關鍵字應該創建匿名類型的IEnumerable。然後,您可以使用Where子句中的id屬性,而無需更改操作的順序。

沒有什麼能阻止您按順序執行操作OrderBySelectWhere。上面的代碼肯定會編譯和運行。但是,邏輯上,您需要在Select之前執行Where,因爲前者是過濾操作,而後者是投影。

0

這個{x.id, x.name}很可能是一個對象數組(假設id是整數,而name是字符串,VB會推斷Object)。它不是屬性爲idname的類的實例。 @ shree.pat18解釋瞭如何調整它以返回所需內容,但爲了清晰起見,我建議使用查詢語法,並在Select之前放置where子句(應稍微快一點,因爲它不會從值中創建匿名對象你不需要包含在結果中):

Dim projects = From p In context.projects 
       OrderBy p.name 
       Where p.Id <> sourceid 
       Select Id = p.Id, Name = p.Name