在对实体使用Linq时,有关将Include()和Load()用于相关表信息存在很多问题。我对这个问题有不同的看法。
我的情况:
我有一个表,该表为系统中的每个用户保存许多时间记录,并且我使用存储库模式和泛型进行开发,因此我的所有实体都有一个接口,可用于标准方法调用。我已关闭了延迟加载,并且自己加载了所有数据。因此,存储库中用于从具有相关表的表中加载所有记录的代码如下:
public class Repository<T> : IRepository<T> where T : class
{
protected readonly ApplicationDbContext Context;
public Repository(IConnectionHelper connection)
{
Context = connection.Context;
}
public virtual DbSet<T> ObjectSet
{
get { return Context.Set<T>(); }
}
public List<T> GetAll(String[] include, Expression<Func<T, bool>> predicate)
{
DbQuery<T> outQuery = null;
foreach (String s in include)
{
outQuery = ObjectSet.Include(s);
outQuery.Load();
}
return outQuery.Where(predicate).ToList();
}
}
该方法的调用如下:
string[] includes = { "User.UserProfile", "CampaignTimeClocks.CampaignRole.Campaign", "Site", "Type" };
DateTime uTcCurrent = GetUtc();
DateTime MinClockinDate = uTcCurrent.AddHours(-10);
List<TimeClock> tcPending = _timeClock.GetAll(includes, x => (x.PendingReview || x.ClockInDate < MinClockinDate && x.ClockOutDate == null) && (x.Site.Id == currentUser.SiteId));
当此方法运行并加载第一个User.Profile表时,它将加载所有时间记录并将它们与所有用户相关联,这需要一分钟以上的时间,这太长了,因为最终记录数仅185条记录,但是查询的初始负载正在运行27,000 * 560用户,即1500万条记录,而且随着时间的推移,这种情况只会变得更糟。
问题是如何在没有这种负载开销的情况下如何做到这一点,我知道我可以链接包含,但是由于包含的数量将根据所调用的数据的类型和用途而改变,因此我不能简单地硬编码一个包含链。
我也尝试过:
List<TimeClock> testLst = _timeClock.GetAll(x => x.PendingReview ||
(x.ClockInDate < MinClockinDate && x.ClockOutDate == null))
.Select(x => new TimeClock{Id = x.Id,
ClockInDate = x.ClockInDate,
ClockOutDate = x.ClockOutDate,
TotalClockTime = x.TotalClockTime,
Notes = x.Notes,
PendingReview = x.PendingReview,
Type = x.Type,
User = x.User,
CampaignTimeClocks = x.CampaignTimeClocks,
TimeClockAdjustments = x.TimeClockAdjustments,
Site = x.User.Site}).ToList();
这将为我提供User.Profile信息,但Site和Type属性为null。
因此,我对如何在此处加载所需的数据感到迷茫。
非常感谢所有帮助。
最佳答案
你能先得到初始清单吗
List<TimeClock> testLst = _timeClock.Where(x => x.PendingReview || (x.ClockInDate < MinClockinDate && x.ClockOutDate == null)).ToList();
然后调用以T作为参数的修改后的
GetAll()
?关于c# - 使用泛型的 Entity Framework 相关对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28481018/