我正在使用EF 6开发一个项目。所以我在项目中有这些图层:
我在数据库层中配置了EF,如下所示:
public class DataContext : DbContext
{
public DataContext() : base("DefaultConnection")
{
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
Database.SetInitializer(
new MigrateDatabaseToLatestVersion<DataContext, MigrationsConfiguration>()
);
}
public DbSet<Line> Lines { get; set; }
public DbSet<Spool> Spools { get; set; }
/......
}
在我的IRepo
我定义了我的界面:
public interface IEndRepository
{
IQueryable<End> Get();
bool Save();
bool Add(End newValue);
bool Delete(End deletedValue);
bool Edit(End UpdatedValue);
IQueryable<End> FindById(int Id);
}
在repo中我实现了这些接口,在我的应用程序(windows窗体)中,我使用ninject将这些存储库注入到我的表单中。我的一个查询看起来像这样:
public IQueryable<ViewMaterial> ViewIMaterial()
{
return (from i in _ctx.Materials
join material in _ctx.MaterialDescriptions on i.MaterialDescriptionId equals material.Id
join Line in _ctx.Lines on i.LineId equals Line.Id
join user in _ctx.Users on i.UserId equals user.Id
join sheet in _ctx.Sheets on i.SheetId equals sheet.Id
select new ViewMaterial
{
Id = i.Id,
LineId = Line.LineNumber,
SheetId = sheet.SheetNumber,
Discipline = i.Discipline,
Quantity = i.Quantity,
MaterialDescriptionId = material.ItemCode,
SubmitDateTime = i.SubmitDateTime,
UserId = user.FullName
});
}
此查询位于Repo图层内,材质中的行数为16000,materiaddescription为42000,line为1300,sheet为3300,user为1。
当我执行此查询时,结果会在3分钟后生成,加载后我的应用程序运行速度非常慢。
我将查询的第一行更改为from i in _ctx.Materials.take(20)
但问题相同。
答案 0 :(得分:0)
我认为它很慢的原因是多次“加入”。 使用EF在单个请求中执行2次以上“加入”可能会很快。
尝试将请求分开或将代码更改为Lazy在查询后立即使用.Load()加载所需的所有数据。
答案 1 :(得分:0)
请尝试以下代码:
public IQueryable<ViewMaterial> ViewIMaterial()
{
return _ctx.Materials.Take(20)
.Select(e=> new ViewMaterial
{
Id = e.Id,
LineId = e.Line.LineNumber,
SheetId = e.Sheet.SheetNumber,
Discipline = e.Discipline,
Quantity = e.Quantity,
MaterialDescriptionId = e.MaterialDescriptions.ItemCode,
SubmitDateTime = e.SubmitDateTime,
UserId = e.User.FullName
});
}