C# 如何将实体框架模型中的方法转换为表达式?
因此,我的具体示例如下:我有一个名为Asset的模型C# 如何将实体框架模型中的方法转换为表达式?,c#,entity-framework,linq,linq-to-sql,C#,Entity Framework,Linq,Linq To Sql,因此,我的具体示例如下:我有一个名为Asset的模型 public class Asset { public Asset() { Transactions = new HashSet<Transaction>(); } public int Id { get; set; } public string Tag { get; set; } public virtual ICollection<Transactio
public class Asset
{
public Asset()
{
Transactions = new HashSet<Transaction>();
}
public int Id { get; set; }
public string Tag { get; set; }
public virtual ICollection<Transaction> Transactions { get; set; }
public Transaction CurrentTransaction => Transactions.OrderByDescending(t => t.Created).FirstOrDefault();
}
公共类资产
{
公共资产()
{
事务=新的HashSet();
}
公共int Id{get;set;}
公共字符串标记{get;set;}
公共虚拟ICollection事务{get;set;}
公共事务CurrentTransaction=>Transactions.OrderByDescending(t=>t.Created).FirstOrDefault();
}
我要做的是将CurrentTransaction()方法转换成运行更快的方法,当我需要获取所有资产的列表以及每个资产的当前事务时,不需要将其拉入内存(如在compile to SQL中)
我真的对表达式或函数一无所知,我觉得这已经做了很多次了,我就是找不到合适的词来搜索。因为
Asset.Transactions
是一个导航属性,访问它总是会导致EF将整个集合加载到内存中(IQueryable
导航属性不受支持)和其他调用(如OrderByDescending()
)将由Linq-to-Objects处理。您能建议一些可能使我的数据结构响应更快的方法吗?基本上,我想提取一个包含所有资产的表(可能有10万个)和每个的最新事务。因此,使用CurrentTransaction作为属性进行选择将对数据库进行数千次调用。尝试从EF上下文投影到另一种类型。类似于:context.Assets.select(x=>new{Asset=x,CurrentTransaction=x.Transactions.OrderByDescending(t=>t.Created)。FirstOrDefault()});
(您可能希望将new{…}
替换为new YourResultType{…}
),因为Asset.Transactions
是一个导航属性,访问它将始终导致EF将整个集合加载到内存中(IQueryable
导航属性不受支持)并进一步调用(如OrderByDescending()
)将由Linq-to-Objects处理。您能建议一些可能使我的数据结构响应更快的方法吗?基本上,我想提取一个包含所有资产(可能是10万个)的表和每个的最新事务。因此,使用CurrentTransaction作为属性进行选择将对数据库进行数千次调用。尝试从EF上下文投影到另一种类型。类似于:context.Assets.select(x=>new{Asset=x,CurrentTransaction=x.Transactions.OrderByDescending(t=>t.Created)。FirstOrDefault()});
(您可能希望将new{…}
替换为newYourResultType{…}
)