今天,我有一个重复的代码:
public class MyProjectionExpressions
{
public static Expression<Func<Log, dynamic>> LogSelector()
{
return log => new
{
logId = log.LogId,
message = log.Message,
};
}
public static dynamic LogSelector(Log log)
{
return new
{
logId = log.LogId,
message = log.Message,
};
}
}
第一个方法是一个可重用的投影表达式,我如下所用:
db.Logs.Select(MyProjectionExpressions.LogSelector());
第二个方法是在我不处理集合时使用的,但只需要序列化一个项,如下所示:
MyProjectionExpressions.LogSelector(someLog);
我试过重用代码,如下所示:
public class MyProjectionExpressions
{
public static Expression<Func<Log, dynamic>> LogSelector()
{
return log => MyProjectionExpressions.LogSelector(log);
}
public static dynamic LogSelector(Log log)
{
return new
{
logId = log.LogId,
message = log.Message,
};
}
}
但是,我遇到了“Linq to Entities vs Linq to Object”的问题,即:我必须像这样重用我的投影表达式:
db.Logs.ToList().Select(MyProjectionExpressions.LogSelector());
因为MyProjectionExpressions.LogSelector()
现在包含(使用)一个Linq到实体无法识别的方法:
LINQ to Entities does not recognize the method 'MyProjectionExpressions.LogSelector()'
的问题是,最后:
如何以Linq到实体继续工作的方式重用lamba表达式?
这个lambda表达式:
log => new
{
logId = log.LogId,
message = log.Message,
};
发布于 2014-06-06 10:15:20
与其按编译方法实现表达式,不如按表达式实现已编译的方法:
public class MyProjectionExpressions
{
public static Expression<Func<Log, dynamic>> LogSelector()
{
return log => new
{
logId = log.LogId,
message = log.Message,
};
}
private static Lazy<Func<Log, dynamic>> func;
static MyProjectionExpressions()
{
func = new Lazy<Func<Log, dynamic>>(() => LogSelector().Compile());
}
public static dynamic LogSelector(Log log)
{
return func.Value(log);
}
}
请注意,为了避免每次需要使用表达式时总是重复使用表达式,您可以缓存编译后的表达式并重用它。
https://stackoverflow.com/questions/24088203
复制