2009-06-19 84 views
2

我正在研究一個數據庫訪問層項目,並決定使用Linq to SQL。我想要做的事情之一是提供一個API,它可以將Linq表達式作爲參數來檢索數據。舉例來說,我寫了這個API,現在看起來是這樣的:Linq to Sql:我這樣做對嗎?

public Result GetResults(System.Linq.Expressions.Expression<Func<Result, bool>> predicate) 
    { 
     Result result = db.Results.SingleOrDefault(predicate); 
     return result; 
    } 

然後,您可以使用此API來查詢數據庫,爲滿足一定條件的限制一行,例如:

Result result = Provider.GetResults(r => r.ID == 11); 

這工作得很好。根據我的情況,我能夠獲得我想要的一排。

下一步是採取這種方式能夠從數據庫中獲取多個對象。

我它得到的工作方式是這樣的:

正如你所看到的,我所說的選擇與R => R,這使我回一切,然後我使用WHERE過濾到我所需要的。

它的工作原理......但有些東西告訴我,我做的確很醜。我可能是錯的,但是這不會將結果表中的所有東西都抽出來然後過濾它嗎?或者它是否將在數據庫級別進行過濾的正確SQL語句放在一起?

無論如何......我非常感謝一些關於如何完成這項任務的指導。如何編寫一個將Linq表達式作爲參數的API,並根據該表達式從數據庫中返回一組對象。

謝謝!

回答

1

Select(r=>r)什麼也不做(除了Table<T>IQueryable<T>變化 - 但沒有有用)。我想你打算通過predicateWhere

確實,這個不是拉出所有東西並過濾它 - 生成適當的WHERE(TSQL)子句。這可能是因爲「延遲執行」和「可組合性」 - 這意味着:直到您開始迭代數據(在ToList()中),它纔會真正執行任何操作,直到您簡單地對查詢進行整形。

您可以通過執行財產以後喜歡看到這一點:

db.Log = Console.Out; 

,並期待在TSQL。或者運行TSQL跟蹤。爲了讓它更漂亮,它簡化爲:

return db.Results.Where(predicate).ToList(); 
+0

是的。我看了一會兒,意識到這一點。我的意思是通過謂語的條款是的,我測試沒有它:) 非常感謝您花時間回答! – Nazeeh 2009-06-19 22:57:58

0

我知道你說你想傳遞一個謂詞並返回一個列表,但你有沒有考慮返回一個IQueryable

然後,你可以撥打:

GetResults().Where(r => r.SomeProperty == "SomeValue") 
    .OrderBy(r => r.SomeOtherProperty) 
    .Skip(10) 
    .Take(10); //etc. 

根據您目前的API的設計,你將返回所有的記錄,然後必須得到10,其中如上面會只返回你所需要的10 ...

只是一些想法.. 。