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