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

时间:2011-04-10 20:41:51

标签: .net dynamic c#-4.0

如果我尝试将动态类型值传递给实体框架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);

2 个答案:

答案 0 :(得分:4)

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

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

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

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

当你想到它在2006年左右的写作方式并且仍然在C#技术进步的前沿时,DLINQ非常了不起; Download included in the \LinqSamples\DynamicQuery directory here

答案 1 :(得分:1)

与@ Suraj的answer类似,因为dynamic在委托(Func)中显然可以,但不是Expression,那么您可以convert the delegate into an 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();