繁体   English   中英

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

[英]An expression tree may not contain a dynamic operation

如果尝试将动态类型值传递给实体框架linq查询,则会收到此错误。

dynamic sname = "suraj";    // even object, var
AppUser appUser = Ctx.AppUsers.First(u => u.Name == sname);

如果我尝试先将值存储在字符串中并使用它,则会收到“对象引用错误”。

var name = "suraj";
string sname = new string(((string)name).ToCharArray());

AppUser appUser = Ctx.AppUsers.First(u => u.Name == sname);

看看DLINQ ,它使您可以执行以下操作:

var query =
    db.Customers.
    Where("City = @0 and Orders.Count >= @1", "London", 10).
    OrderBy("CompanyName").
    Select("new(CompanyName as Name, Phone)");

请注意,查询中的表达式是可以在运行时动态构造的字符串。

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

当您考虑一下DLINQ在2006年左右 的编写方式时 ,仍然是C#技术进步的前沿,它非常令人惊叹在\\ LinqSamples \\ DynamicQuery目录中包含下载

与@Suraj的答案类似,由于在委托( Func )中dynamic似乎可以,但在Expression不是可以的,那么您可以将委托转换为表达式

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM