2011-07-24 82 views
2

我如何轉換的LINQ to對象查詢或任何其他Func鍵代表串像SQL語句轉換的LINQ to對象查詢到SQL查詢(沒有的LINQ to SQL代碼或DataContext的)

例如

var cat_list = new List<Cat> { ... }; 

var myquery = cat_list.Where(x => x.Age > 2 && x.Name.Contains("Kitty")); 

現在myquery是IEnumerable<Cat>。我怎麼能這樣轉換成這樣簡單的東西

"Age > @p1 AND Name LIKE @p2" 

我怎麼能做到這一點?

+0

不確定你實際要求什麼。你想採取任何給定的IQueryable (它已經有一個.Where()應用於列表,並將其轉換爲類似SQL的語句? –

+1

在您的代碼中,'myquery'是'IEnumerable '。 – svick

+0

yes ,就是這樣,其實我的意思是把已經應用到列表中的條件部分,並將此條件轉換爲sql語句。 –

回答

2

做那樣的事情並不簡單。看看Matt Warren發表的一系列文章Building an IQueryable provider。他使用的所有代碼也可以作爲庫來使用。這應該有助於你開始。

1

你可以編寫一個表達式樹解析器並生成sql。您的描述包含故障 - myquery不是IQueryable<Cat>,它是IEnumerable<Cat>。正如你正確地標記了它,這是linq-to-objects,而不是linq-to-sql。構造查詢的調用中沒有信息。

+0

我知道,我想這是因爲linq to object完全在內存中執行,相反,linq to sql有一部分是在數據庫引擎本身上執行的,但是是否有任何類型的表達式解析器會通過表達式樹並生成這sql像statemtn? –

+1

請參閱@ svick的帖子。這將是一個起點。 – Femaref

0

查看DataContext.GetCommand()方法,它傳遞一個IQueryable對象並返回與該查詢相對應的DbCommand對象。 DbCommand對象的CommandText屬性顯示查詢的文本。

+0

沒有其實這是linq的對象不LINQ到SQL,謝謝你的C ooperation –