如何在select子句中使用表达式

时间:2018-05-09 15:42:44

标签: c# entity-framework linq

考虑以下伪代码

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

怎么做?

2 个答案:

答案 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中的异常触发到对象。