是否可以在lambda表达式中调用自定义方法。?
//Address a : It's an Entity
public string AddressConstructor(Address a)
{
return a.City + "," + a.Province;
}
var Test = _db.MyTableTest.Select( t => new ViewModel
{
MyID = t.ID,
StringAddress = AddressConstructor(t.Addr)
};
答案 0 :(得分:3)
您应该能够使用LINQKit将表达式内联到表达式树中来完成此任务。
http://www.albahari.com/nutshell/linqkit.aspx
这将导致您尝试在SQL Server上运行的连接,而不是在内存中运行(如另一个答案中所述)。 SQL Server当然知道如何连接字符串,但是如果你的AddressConstructor做了一些SQL Server无法理解的东西,那么这种方法就不行了,你确实需要使用另一种方法中描述的方法在内存中执行自定义方法。答案。
基本上LINQKit将展平树,因此它实际上被执行为:
var Test = _db.MyTableTest.Select( t => new ViewModel
{
MyID = t.ID,
StringAddress = t.Addr.City + "," + t.Addr.Province
};
哪个EF应该没有问题执行(并且连接应该在SQL Server上发生)。
答案 1 :(得分:1)
您需要调用AsEnumerable
以便在本地执行投影:
var Test = _db.MyTableTest.AsEnumerable()
.Select( t => new ViewModel
{
MyID = t.ID,
StringAddress = AddressConstructor(t.Addr)
};
否则,使用Queryable.Select
方法而不是Enumerable.Select
,这会导致实体框架尝试将lambda表达式转换为SQL查询(在这种情况下当然不可能)