2010-04-14 30 views
0

假設我採取任意LINQ to SQL查詢的表達式,是否可以以某種方式調用它?如何表達式調用任意LINQ to SQL查詢

MyContext ctx1 = new MyContext("..."); 
var q = from t in ctx1.table1 where t.id = 1 select t; 
Expression qe = q.Expression; 
var res = Expression.Invoke(qe); 

此拋出:

ArgumentException的 「類型System.Linq.IQueryable`1 [...]」不能被援引的表達」。

我的最終目標是評估幾個不同數據上下文中的相同查詢。

回答

0

LINQ to SQL表達式由LINQ  解析爲  SQL提供程序並轉換爲T-SQL。我的猜測是,異常正在被明確提出 - 微軟並不打算直接調用這些表達式(您可以使用.NET Reflector進行確認。)

0

如果您的目標是在不同的上下文中運行Expression,爲什麼不創建就像這樣表達: -

Expression<Func<MyClass, bool>> myExpression = x => x.id == 1; 

然後,你可以做任何你喜歡它,包括在使用。哪裏是()條款。

+0

查詢比WHERE子句的方式更多。我想*任意*查詢。 – 2010-04-14 18:03:08

1

查詢不是表達式。查詢具有表達式樹。

查詢不是要調用的方法。

可以枚舉查詢,得出結果。此代碼將枚舉所有的IQueryable:

List<object> result = query.Cast<object>().ToList(); 

我的最終目標是在幾個不同的數據 環境評估 相同的查詢。

然後,您應該將查詢作爲查詢生成器編寫,並接受DataContext作爲參數。

Func<MyDataContext, IQueryable<Customer>> queryGen = 
    (dc) => dc.Customers.Where(c => c.Name == "Bob"); 
    //now we can get some queries 
IQueryable<Customer> query1 = queryGen(new MyDataContext()); 
IQueryable<Customer> query2 = queryGen(new MyDataContext()); 
+0

你聲稱屬性IQueryable.Expression不存在嗎? http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.expression.aspx – 2010-04-14 18:30:39

+0

訪問查詢的表達式以篡改DataContext就像拆卸汽車引擎以打開收音機。 – 2010-04-14 18:52:33