2009-08-03 99 views
2

我正在使用Predicate Builder的Linq to Sql,並試圖優化從數據庫中檢索多少信息。我想只選擇某些字段在gridview中顯示它們。當我僅選擇我想要的內容時,我添加的搜索參數(請參見下文)不起作用,PredicateBuilder也不起作用。下面是目前我在做什麼(這樣的作品,但得到的一切是太多的信息),如果我改變,只選擇我需要什麼,這樣Linq to Sql - 僅選擇某些信息(帶謂詞生成器)

' Initial Setup ' 
    Dim db As New MyDataContext() 
    Dim results = From p In db.Products _ 
        Select p 

    ' Search ' 
    If (testCase) Then 
     results = results.Where(Function(p) p.SomeAttribute = 123) 
    End If 

Dim results = From p In db.Products _ 
        Select p.Name, p.SomethingElse 

然後我注意到,如果信息被選中(即我選擇p.SomeAttribute),那麼我可以搜索(添加where子句)該屬性,但如果沒有,我不能。如果我選擇整個項目(即選擇p),則只有謂詞構建器纔有效。所有這些應該做的就是創建SQL語句,而不必選擇要由其進行搜索的屬性。我怎樣才能使這個工作,只選擇我需要的東西,但搜索任何東西,並保持prediate生成器工作?任何幫助很高興!謝謝

回答

1

你可以嘗試最初在開始時做一個「選擇p」,然後添加所有where子句,最後從中選擇你需要的。

' Initial Setup ' 
Dim db As New MyDataContext() 
Dim results = From p In db.Products _ 
       Select p 

' Search ' 
If (testCase) Then 
    results = results.Where(Function(p) p.SomeAttribute = 123) 
End If 

' trim down the columns after you've added the wheres... 
Dim results2 = from p in results 
       Select p.Name, p.SomethingElse 
+0

嗨,我實際上已經試過了,它給出了這個錯誤: 無法投射'System.Data.Linq.DataQuery`1類型的對象[VB $ AnonymousType_0`3 [System.Int32,System.Int32,System .String]]'鍵入'System.Linq.IQueryable`1 [MyNamespace.Product]'。 圍繞那一個的任何想法? – Ryan 2009-08-03 17:13:25

+0

我的例子中有一個錯誤會導致錯誤 - 我已經更新了示例來修復它。 – 2009-08-03 18:26:03

1

你不能用謂詞構建器(構建布爾表達式)修改「選擇列表」(這是我理解你的問題的方法,我可能誤解了它)。你應該手動使用System.Linq.Expressions命名空間中的東西來做到這一點,但我建議使用Dynamic LINQ來代替。

0

聽起來像你正在做的投影,而不是原來的產品。執行投影在應用了所有搜索條件後,在末尾選擇p.Name,p.SomethingElse。