考虑以下伪代码
name="@model.id"
=> CS0029无法隐式转换类型&System; Linq.Expressions.Expression>'到' System.DateTime?'
如果我尝试编译
Expression<Func<E,Datetime?>> expr =
e => (e.d1 ?? e.Rel.d1) ?? e.d2;
var q = myContext.E_DbSet.Select(x => new someDeclaredType {
Id = x.Id,
V = expr
});
=&GT; NotSupportedException:节点类型&#39; Invoke&#39;在LINQ to Entities中没有支持LINQ表达式。
我读了Invoke an Expression in a Select statement - LINQ to Entity Framework。但这不是我的确切情况。我需要在select子句中包含一个现有的表达式。该表达式是函数调用的结果。所以我必须在我的select子句中使用Expression<Func<E,Datetime?>> expr =
(e => (e.d1 ?? e.Rel.d1) ?? e.d2).Compile();
var q = myContext.E_DbSet.Select(x => new someDeclaredType {
Id = x.Id,
V = expr(x)
});
。
怎么做?
答案 0 :(得分:1)
也许是这样的:
Expression<Func<E,someDeclaredType>> expr =
e => new someDeclaredType()
{
Id = e.Id,
V = (e.d1 ?? e.Rel.d1) ?? e.d2
};
var q = myContext.E_DbSet.Select(expr);
答案 1 :(得分:-1)
我终于找到了办法:
Expression<Func<E,Datetime?>> expr =
e => (e.d1 ?? e.Rel.d1) ?? e.d2;
Expression<Func<E,someDeclaredType>> sel =
x => new someDeclaredType {
Id = x.Id,
V = expr.Compile()(x)
};
var q = myContext.E_DbSet.Select(sel.Compile());
另一个编码是(来自@Anthony):
Expression<Func<E, someDeclaredType>> sel =
e => new someDeclaredType()
{
Id = e.Id,
V = expr.Compile()(e)
};
q = Files.Select(sel.Compile());
示例:dotnetfiddle
请注意,代码是为linq设计的。由于Rel = null
,它可能会将linq中的异常触发到对象。