2012-11-21 49 views
2

我使用LinqKit(http://www.albahari.com/nutshell/linqkit.aspx)LINQ實體在運行時生成查詢'參數不在範圍內。' LinqKit

有沒有辦法有下面的代碼工作,而無需定義一個具體類?

試圖用LINQ to Entities構建一個強類型的動態查詢。

我收到了The parameter 'o' is not in scope.錯誤。

在某些情況下。

void Main() 
{ 
    var lquery = from a in Foo select new { Bar = a.Baz }; // <-- error like this 
    //var lquery = from a in Foo select new stuff { Bar = a.Baz }; // <-- here no error 
    test("Case", lquery, o => o.Bar).Dump(); 
} 

class stuff { public string Bar {get; set;} } 

IQueryable<T> test<T>(string val, IQueryable<T> qry, Expression<Func<T, string>> selector){ 
    var ex = selector.Expand(); 
    var b = from c in qry.AsExpandable() 
      where ex.Invoke(c).Contains(val) 
      select c; 
    return b; 
} 

看來,當一個匿名類與test()使用時的具體類stuff則使用沒有錯誤引發此錯誤。有沒有可以在這種情況下使用匿名類的解決方法?

我意識到這個錯誤可能LinkKit相關,但我沒有足夠的技術知識在那裏潛水......

+0

'Foo'是如何定義的?另外,在問題中的代碼無法再現時,無法從'Main'調用'test'的類型參數。 –

+0

此代碼可以與** LinqPad **一起使用**'Foo'可以替換爲一個表名'Baz'可以替換爲表中的一列。我在** LinqPad中運行代碼**工作正常,需要LinqKit.dll和'System.Linq.Expressions'和'LinqKit'命名空間的引用。 – FooUser

+0

謝謝,這是有道理的,我設法在LinqPad再現。 –

回答

1

LinqKit我增加了一個檢查匿名類ExpressionExpander.VisitMemberAccess()讓匿名課程工作。

relpaced

if (m.Member.DeclaringType.Name.StartsWith ("<>")) 
    return TransformExpr (m); 

string typeName = m.Member.DeclaringType.Name; 
bool isAnonymous = typeName.StartsWith("<>f__AnonymousType"), 
    isOuter = !isAnonymous && typeName.StartsWith("<>"); 
if (isOuter) 
    return TransformExpr (m);