在对实体使用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/

10-13 06:54