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