2010-07-28 92 views
2

我對Linq非常陌生,並且正在使用Linq-to-Sql,如下所示。但是在下面的例子中,我的where子句永遠不會被執行,並且結果查詢會嘗試從我的表中獲取所有記錄,甚至忽略take方法。Linq-to-sql - 查詢未被過濾

能有人指出,以什麼我做錯了

 var baseQry = db.Table; 
     baseQry.Where(a => a.tab_id == theId); 
     baseQry.Select(o => new 
     { 
      o.name, 
      o.display_name, 
      o.type, 
      o.info,     
      time_stamp = (Convert.ToDateTime(o.timestamp).ToLongDateString()) 
     }).Take(10); 

     baseQry.ToList(); 

回答

3

你的第二個行...

baseQry.Where(a => a.tab_id == theId); 

...基本上是一個空操作,因爲生成的查詢ISN不會延續到您的.Select條款中。

你需要把它改成這樣:

var baseQry = db.Table; 

var results = baseQry 
    .Where(a => a.tab_id == theId) 
    .Select(o => new 
     { 
      o.name, 
      o.display_name, 
      o.type, 
      o.info,     
      time_stamp = (Convert.ToDateTime(o.timestamp).ToLongDateString()) 
     }) 
    .Take(10) 
    .ToList(); 
+0

感謝馬特,是工作的。我試圖分解它的原因是,我可以根據用戶輸入動態添加更多的子句。在句法上,我相信我的代碼看起來和你的代碼很相似,但是對於一件小事,你的作品與我的不同!! 我已經研究過使用PredicateBuilder和Scott的動態linq庫,但在進入所有這些之前,我想嘗試一些簡單的東西。 任何解釋將不勝感激。 – Karthik 2010-07-28 21:56:49

+1

IQueryable 是你的朋友(http://msdn.microsoft.com/en-us/library/bb351562.aspx)。您的查詢(.Where,.Select,.Take)中的任何子句都沒有實際檢索數據。他們只是建立一個查詢,然後在您調用ToList()時執行。你會在LINQ世界看到這個叫做「延期執行」的東西。好的是,只要將查詢片段的返回值保存爲IQueryable ,就可以繼續添加它們以進一步修改查詢。我希望我解釋得很好。 – 2010-07-28 22:02:17

+0

謝謝。我能夠使用IQueryable並使其工作。雖然很詳細。非常感謝你的幫助。 – Karthik 2010-07-29 00:38:22