【问题标题】:Entity Framework Join multiple tables is slow实体框架连接多个表很慢
【发布时间】:2020-08-14 19:56:42
【问题描述】:

我第一次尝试使用 Entity Framework 加入这么多表。

一切正常,但加载时间约为 1 分钟,非常糟糕。我不知道加入这么多表是否有一些不同的解决方案,或者有什么帮助。

数据库中大约有 5000 条记录。我认为将来这个记录的数量可以更高。我需要什么能拿走它的东西。谢谢。

代码如下:

var JoinedTopCars = db.CustomerAdvertisement.Where(o => o.Top == true)
 .Join(
db.CarManufacturerName,
n => n.CarManufacturerId,
q => q.CarManufacturerId,
(n, q) => new
{
    n,
    q,
})
 .Join(
db.CarManufacturerModel,
o => o.n.CarModelId,
j => j.CarModelId,
(o, j) => new
{
    j,
    o,
}).Where(y => y.j.CarManufacturerId == y.o.q.CarManufacturerId)
.Join(
db.TypeOFFuel,
e => e.o.n.FuelId,
r => r.Id,
(e, r) => new
{
    e,
    r,
})
.Join(
db.TypeOFGearBox,
t => t.e.o.n.GearBoxId,
i => i.Id,
(t, i) => new
{
    t,
    i,
})
.Join(
db.Country,
y => y.t.e.o.n.CountryOfOrigin,
u => u.Id,
(y, u) => new
{
    y,
    u,
})
 .Join(
db.TypeOFChassis,
c => c.y.t.e.o.n.ChassisId,
d => d.Id,
(c, d) => new
{
    c,
    d,
})
.Join(
db.CarDoors,
e => e.c.y.t.e.o.n.CarDoorsId,
f => f.Id,
(e, f) => new
{
    e,
    f,
})
.Join(
db.TypOfMovement,
g => g.e.c.y.t.e.o.n.MovementId,
f => f.Id,
(g, f) => new
{
    g,
    f,
})
.Join(
db.Area,
i => i.g.e.c.y.t.e.o.n.AreaOfOrigin ?? 0,
f => f.Id,
(i, f) => new
{
    i,
    f,
})
.Join(
db.District,
j => j.i.g.e.c.y.t.e.o.n.OkresOfOrigin ?? 0,
f => f.Id,
(j, f) => new
{
    j,
    f,
})
.Join(
db.CarColor,
k => k.j.i.g.e.c.y.t.e.o.n.CarColorId,
x => x.Id,
(k, x) => new JoinedTopCars
{
    Id = k.j.i.g.e.c.y.t.e.o.n.Id,
    Objem = k.j.i.g.e.c.y.t.e.o.n.cm3,
    Carname = k.j.i.g.e.c.y.t.e.o.q.CarName,
    CarModel = k.j.i.g.e.c.y.t.e.j.CarModel,
    Typ = k.j.i.g.e.c.y.t.e.o.n.ModelType,
    Color = x.ColorName,
    Karoseria = k.j.i.g.e.d.ChassisName,
    Dvere = k.j.i.g.f.NumberOfDoors,
    Pohon = k.j.i.f.Movement,
    VIN = k.j.i.g.e.c.y.t.e.o.n.VIN,
    Metalic = k.j.i.g.e.c.y.t.e.o.n.Metalic,
    Poskodene = k.j.i.g.e.c.y.t.e.o.n.Crashed,
    Pojazdne = k.j.i.g.e.c.y.t.e.o.n.Drivable,
    DPH = k.j.i.g.e.c.y.t.e.o.n.DPH,
    Leasing = k.j.i.g.e.c.y.t.e.o.n.Leasing,
    Emisie = k.j.i.g.e.c.y.t.e.o.n.Emmisions,
    Spotreba = k.j.i.g.e.c.y.t.e.o.n.Consumption,
    Km = k.j.i.g.e.c.y.t.e.o.n.KM,
    Rok = k.j.i.g.e.c.y.t.e.o.n.DateOfOrigin.ToString(),
    Vykon = k.j.i.g.e.c.y.t.e.o.n.HP,
    Palivo = k.j.i.g.e.c.y.t.r.Fuel,
    Prevodovka = k.j.i.g.e.c.y.i.GearBox,
    Krajina = k.j.i.g.e.c.u.CountryName,
    Okres = k.f.DistrictName,
    Kraj = k.j.f.AreaName,
    Vybava = k.j.i.g.e.c.y.t.e.o.n.Equipment,
    Popis = k.j.i.g.e.c.y.t.e.o.n.Description,
    Kontakt = k.j.i.g.e.c.y.t.e.o.n.ContInfo,
    ZobrazMeno = k.j.i.g.e.c.y.t.e.o.n.ShowName,
    ZobrazCislo = k.j.i.g.e.c.y.t.e.o.n.ShowPhone,
    Cena = k.j.i.g.e.c.y.t.e.o.n.Price,
    TitleImage = k.j.i.g.e.c.y.t.e.o.n.TitlePhoto,
})
.OrderByDescending(z => z.Id)
.Take(15);

编辑:我让@romfir 写下下面的内容,并将加载时间从 1 分钟缩短到 3 秒。

  1. 创建 SQL 视图
  2. 插入带有 JOIN 表的 SQL 查询(如果您希望空值使用 LEFT JOIN)
  3. 更新 ADO.NET EF 模型,.edmx 文件
  4. 使用这个类似于表的 SQL 视图

【问题讨论】:

  • 你可以尝试在数据库中创建一个类似的View,它会更快,因为数据库引擎会优化它。
  • 你能解释一下具体是怎么做的吗?

标签: sql asp.net database frameworks entity


【解决方案1】:

您可以尝试在数据库中创建View,如下所示:

CREATE VIEW my_view_name
AS
SELECT
    CustomerAdvertisement.ID as CustomerAdvertisementID -- 'as Name' is optional
    CustomerAdvertisement.cm3
    -- other columns You want to include
FROM 
    CustomerAdvertisement
JOIN CarManufacturerName 
    on CarManufacturerName.CarManufacturerId = CustomerAdvertisement.CarManufacturerId
JOIN SomeTable
    on some_condition
-- other joins

WHERE
    CustomerAdvertisement.Top = true
    and other_conditions

创建符合您条件的视图后,您可以scaffold它,然后在您的代码中使用。

【讨论】:

  • 哇!巨大的差异,从加载 1 分钟到 3 秒 :) 谢谢我会发布教程来解决我的问题。
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2012-10-23
  • 2014-03-08
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多