繁体   English   中英

在Linq to Entities中使用扩展方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM