2011-03-06 67 views
2
//my question is here 
public static Query Where<TElement>(this Query query, Func<TElement, bool> predicate) 
{ 
    query.sql +=" FROM Table WHERE "+ predicate+";"; 
    return query; 
} 

//Query class 
public class Query 
{ 
    public Query(){} 
    public Query(string sql){this.sql = sql;} 
    public string sql { set; get; } 
} 

//User class 
public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

//example: 
User user = new User() { ID=1,Name="test"}; 
Query query = new Query(); 
query = query.Where<User>(u=>u.ID==user.ID); 
Console.WriteLine(query.sql); 

運行後,其結果是:約Func鍵<TElement,bool>的謂詞

FROM Table WHERE System.Func'2[DAL.User,System.Boolean]'; 

但我需要的是:

FROM Table WHERE ID=1; 

有人能幫助我嗎?

+0

你能解釋這部分是在哪裏進來嗎? 'U => u.ID == user.ID'。你只想給這個ID,如果它匹配,否則你想要什麼? – 2011-03-06 03:06:37

+0

首先,如果你想解析謂詞,它必須是'Expression >'類型,我的下一個問題是你的目標是什麼?如果你正在使用Linq To Sql的問題標籤陳述你爲什麼要重新創造'Where'? – 2011-03-06 03:10:43

+0

我想知道linq怎麼做 – artwl 2011-03-06 03:12:32

回答

3

如果您想了解Linq to Sql如何構建SQL查詢,您的第一步將學習關於Expression Trees

下一步將會對ExpressionVisitor有所瞭解,這將有助於您如何訪問表達式樹中的每一部分。

從那裏通過博客系列"LINQ: Building an IQueryable provider series"閱讀了解如何將表達式樹解析爲sql。

"Where and reusable Expression tree visitor"將幫助你如何解析你的謂詞。現在

,因爲你將不會被IQueryable<T>.Where()工作,但只是在Expression<Func<T, bool>>這些職位並不是一切都將完全涉及,但應該是一個良好的開端如何where子句解析謂詞表達成一個有效的SQL。

希望這可以讓你開始!

+0

您的參考資料比我的更好。提問者,請按照這些鏈接! – Jollymorphic 2011-03-06 03:31:46

+0

您認爲在這裏可以使用Edulinq的鏈接嗎?它描述了Linq2Objects,但仍將大致概述Linq如何實現。 http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx我不想寫一個新問題來補充,但如果您認爲它有用,請隨時將其編輯到您的答案中。歡呼 – 2011-03-06 03:45:05

1

看來您正在嘗試使您的Query類可以在LINQ中訪問,在這裏。當你參與LINQ Where子句時,你得到的謂詞是一個函數對象,而不是一個字符串。其思想是將謂詞函數應用於枚舉的每個元素,並返回yield - 僅返回函數返回「true」的元素。

LINQ-to-SQL查看這樣的謂詞內的代碼,它假定它是一個可以分析並轉換爲SQL表達式的表達式(例如,lambda表達式)。請記住,編譯器可以將C#lambda生成到委託或表達式樹中(請參閱this MSDN topic),具體取決於表達式中預期的類型。因此,LINQ-to-SQL在其他工作中做了大量工作字,將該謂詞轉化爲可以針對數據庫引擎運行的東西。

如果你真的想要LINQ,你可能只需要獲取查詢中的所有記錄,然後用謂詞過濾它們,除非這代表了縮放問題(取決於你的應用程序的嚴重性)。此外,你必須編寫一個適當的Where函數,它返回一個IEnumerable對象並使用yield-return。請參閱this tutorial page(您將不得不向下滾動)或閱讀簡明書中出色的C#中的LINQ章節。另一方面,如果你實際上並不關心LINQ,並且這段代碼只是巧合地LINQ-y,那麼只要將你的參數類型改爲字符串,然後在你想使用的表達式周圍加上引號即可。

相關問題