我有一种情况,当我必须将多个表中的数据加载到单个对象中时,即我有单独的表用于 BasicProperties
和几种“高级”属性`(我不允许重构数据库或对象模型)。
但是,由于加载高级属性的开销很大,而且在大多数情况下是不必要的,所以我想省略它,除非明确指定。
我目前拥有的是这样的:
from basics in ctx.Basics
join numerics in ctx.Numerics on basics.ID equals numerics.ItemID
join alphas in ctx.Alphas on basics.ID equals alphas.Itemid
join cplx in ctx.Complex on basics.ID equals cplx.Itemid into complex
select new HodgePodge
{
Basics = basics,
Numerics = numerics,
Alphas = alpha,
Complex = complex
};
所以我需要一些(简单的)方法来包含/排除 Numerics
、Alphas
和 Complex
数据库表的加载。
基本上,我是这个试图优化加载代码的项目的“客人”,所以我不允许对代码进行过多更改,最坏情况下的性能必须至少保持不变。
最佳答案
您可以将您的join
逻辑移动到select
语句中,并根据您的关系类型(1:1, 1:*
)您使用 FirstOrDefault
或 Where
bool loadNumerics = true;
bool loadAlphas = true;
bool loadComplex = true;
var query = from basics in ctx.Basics
select new HodgePodge
{
Basics = basics,
Numerics = ctx.Numerics.FirstOrDefault(x => loadNumerics == true && basics.ID == x.ItemID),
Alphas = ctx.Alphas.FirstOrDefault(x => loadAlphas == true && basics.ID == x.Itemid),
Complex = ctx.Complex.Where(x => loadComplex == true && basics.ID == x.Itemid),
};
关于c# - 可选加入 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22379933/