.net 表达式树不能包含动态操作

.net 表达式树不能包含动态操作,.net,dynamic,c#-4.0,.net,Dynamic,C# 4.0,如果我试图将动态类型值传递到实体框架linq查询中,就会出现此错误 dynamic sname = "suraj"; // even object, var AppUser appUser = Ctx.AppUsers.First(u => u.Name == sname); 如果我尝试先将值存储在字符串中并使用它,我会得到 “对象引用错误” 看看哪一个可以让你做一些事情,比如: var query = db.Customers. Where("City = @0

如果我试图将动态类型值传递到实体框架linq查询中,就会出现此错误

dynamic sname = "suraj";    // even object, var
AppUser appUser = Ctx.AppUsers.First(u => u.Name == sname);
如果我尝试先将值存储在字符串中并使用它,我会得到 “对象引用错误”

看看哪一个可以让你做一些事情,比如:

var query =
    db.Customers.
    Where("City = @0 and Orders.Count >= @1", "London", 10).
    OrderBy("CompanyName").
    Select("new(CompanyName as Name, Phone)");
请注意,查询中的表达式是可以在运行时动态构造的字符串

该库有一些非常好的功能,包括隐式转换到表达式树,您将能够顺利地集成到现有的表达式树中

(当你回想一下它在2006年前后是如何写的,并且仍然处于C#technology advancements;)与@Suraj的类似,DLINQ非常令人惊讶,因为
动态
在代理(
Func
)中显然是可以的,但不是
表达式,那么你可以:

dynamic config=JsonConvert.DeserializeObject(configJsonString);
var typeName=config.type.ToString();//子句需要一个字符串,只是为了可读性将其分隔开
//你条款的核心--
//我们将使用o=>wrapper(o)将其转换为一个表达式
Func包装器=(n=>n.Name==typeName);
//换行到表达式并用作正则子句
var expectedType=repository.Where(o=>wrapper(o)).FirstOrDefault();

否,这是实体框架的上下文。对不起,第一种情况下sname是动态的,第二种情况下名称是动态的。名称不是动态的。“var”关键字不会使变量成为动态变量,编译器会在赋值的右侧推断类型,并将该类型赋予“var”。我建议将此作为答案,因为LINQ本身不支持表达式中的动态对象(因此会出现错误消息)。我还没有尝试过这种解决方案。即使这样,我也不太舒服。这就像回到旧的sql字符串(ado.net)一样。无论如何,它都会是,Suraj。只要您使用的是dynamic,抱怨latebinding就很奇怪。另外,别忘了,你只需要在最后一步使用它,其余的都可以是strongtype,就像我们都喜欢Hanks一样,这个答案帮助了我。
var query =
    db.Customers.
    Where("City = @0 and Orders.Count >= @1", "London", 10).
    OrderBy("CompanyName").
    Select("new(CompanyName as Name, Phone)");
dynamic config = JsonConvert.DeserializeObject(configJsonString);
var typeName = config.type.ToString(); // clause expects a string, just separating it out for readability

// the guts of your clause --
// we'll turn this into an expression with o => wrapper(o)
Func<TEntity, bool> wrapper = (n => n.Name == typeName);

// wrap to expression and use as regular clause
var expectedType = repository.Where(o => wrapper(o)).FirstOrDefault();