[英]Using extension method in Linq to Entities
码:
public static IEnumerable<TableRowModel> GetRows()
{
var to_ret = db.TableRows.select(x=> new TableRowModel(){
TableRowId = x.TableRowId,
Type = x.Type,
Name = x.Name,
CreatedAt = x.CreatedAt,
ModifiedAt = x.ModifiedAt,
Enums = x.Enums.Select(y => y.ToEnumModel()),
});
return to_ret;
}
public static EnumModel ToEnumModel(this Enum x)
{
var to_ret = new EnumModel()
{
CFPId = x.CFPId,
CreatedAt = x.CreatedAt,
ModifiedAt = x.ModifiedAt,
};
return to_ret;
}
使用GetRows
方法时出现以下错误:
LINQ to Entities无法识别该方法
考虑到该错误,可以理解LINQ To Entities
无法识别扩展方法ToEnumModel
。 我想知道是否有解决办法? 这样我就不会在GetRows
扩展中再次重复ToEnumModel
代码。
在正常情况下,当执行诸如EntityFramework中的Where
类的操作时,它实际上不会像对枚举(如List)那样在内存中执行。 相反,它转换为SQL,然后由Db提供程序执行。 这意味着不能执行某些操作,例如对对象使用扩展方法,因为转换器无法将这些操作转换为SQL。
最快,最简单的解决方案是将您的设置加载到内存中,并可以像其他任何枚举一样对其进行操作。 您可以这样做:
var result = myDbSet.AsEnumerable().Etc()
这里的Etc()
表示要运行的所有其他操作。 但是请注意,这会将所有数据加载到内存中,这在某些情况下可能会非常缓慢且昂贵。 一种缓解此问题的方法是,在需要使用扩展方法之前将AsEnumerable()
放在正确的位置 ,从而将尽可能多的操作分担给提供程序。 例如:
var result = myDbSet.Where([condition]).AsEnumerable().Select(item => item.ExtensionMethod());
可能比这更快更轻:
var result = myDbSet.AsEnumerable().Where([condition]).Select(item => item.ExtensionMethod());
您在EF中使用扩展方法的能力受到限制,但是您仍然可以扩展IQueryable
public static class Extensions
{
public static IQueryable<MyModelVM> SelectVMs(this IQueryable<MyModel> models)
{
return models.Select(x => new MyModelVM { MyModelId = x.MyModelId });
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.