2012-09-24 29 views
1

我想在我的Linq-to-SQL請求中連接我的過濾器字符串。這是我第一次在c#和Linq中成爲新手。將字符串過濾器連接在哪裏

string f = "where 1==1"; 
      if (!string.Equals(t, "0")) 
      { 
       f += " AND p.lId==" + a;   
      } 
      if (!string.Equals(tc, "0")) 
      { 
       f += " AND p.tp.Id==" + b; 
      } 

我想在LINQ查詢我where替換此字符串這樣

var req = from p in db.Pt 
         +f+ 
         select new { L= p.bt, Lg = p.Sl }; 
+4

這是一個壞主意。它會打開你的SQL注入。 – Arran

+0

關於來自@Arran的評論,您應該查看參數化查詢,這是停止SQL注入的主要實現之一。 –

回答

0

我勸阻了LINQ使用字符串連接,但如果你真的需要它(我的意思是怪異的情景) ,你可以嘗試DynamicLinq

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+0

我嘗試它,但它告訴我System.Linq.IQueryable 到System.Data.Entity.DbSet user1694698

+0

我不明白,你有什麼嘗試?我在問,因爲我在不同的答案中看到了相同的評論。 – ivowiblo

2

什麼你正在嘗試做的可以用LINQ實現種方法:

var req = db.Pt; 

if (!string.Equals(t, "0")) 
{ 
    req = req.Where(p => p.lId == a); 
} 

if (!string.Equals(tc, "0")) 
{ 
    req = req.Where(p => p.tp.Id == b); 
} 

req = req.Select(p = > new { L= p.bt, Lg = p.Sl }); 
+0

正要回答相同的問題。這是要走的路 – ivowiblo

+0

我嘗試它,但它告訴我System.Linq.IQueryable 到System.Data.Entity.DbSet user1694698

+0

那是因爲你正在將它轉換爲DbSet 。你爲什麼需要這個?一旦你查詢了DbSet,你就有了一個IQueryable,而不是一個DbSet。 – ivowiblo

0

您可以使用以下方法:

var query = from p in db.Pt 
      select p; 

if (!string.Equals(t, "0")) 
{ 
    query = query.Where(p => p.lId== a); 
} 

if (!string.Equals(tc, "0")) 
{ 
    query = query.Where(p => p.tp.Id== ba); 
} 

var req = from p in query 
      select new { L= p.bt, Lg = p.Sl }; 

的LINQ可以動態這種方式組成。如果您現在執行req.ToList();,則將執行您的查詢。由於這種懶惰的行爲,你可以在不同的步驟中編寫你的查詢。