簡體   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