2

我正在使用 LinqKit (http://www.albahari.com/nutshell/linqkit.aspx)

有没有办法让下面的代码工作而不必定义一个具体的类?

尝试使用 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 相关,但我没有足够的技术知识来深入了解......

4

1 回答 1

1

LinqKit 中,我向 ExpressionExpander.VisitMemberAccess() 添加了对匿名类的检查,以使匿名类正常工作。

更换

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);
于 2012-11-23T17:09:55.500 回答