【发布时间】:2016-10-21 13:39:44
【问题描述】:
我有一个在 Entity Framework 6, Model First 上运行的应用程序,在旧数据库上运行。
在应用程序中,我们有一个Person 对象,该对象具有一个或多个Address 对象。这些使用额外的表格链接:PersonXAddress,如下所示:
Person
Id
Name
...
PersonXAddress
PersonId
AddressId
Address
Id
Street
PostalCode
...
使用AutoMapper,我将一个属性添加到我的PersonDto“HomeAddres”,即带有AddressType == 1 的地址,如下所示:
Mapper.CreateMap<Person, PersonDto>()
.ForMember(x => x.HomeAddress,
o => o.MapFrom(y => y.PersonXAddresses
.Where(a => a.Address.AddressTypeId == 1)
.Select(x => x.Address).FirstOrDefault();
所以在我的代码中,我永远不必遍历所有不同的地址来找到那个人的 HomeAddress。
但是,我发现这很慢。它创建了一个巨大的 sql 查询(大约 50 行 sql),第一次运行这个查询可能需要 30 秒。第一次触发后,查询可能需要将近 1 秒才能从数据库中获取一些 Person 对象。 我发现如果我注释掉上面的映射,生成的查询会在不到一秒的时间内启动,并在几毫秒内返回结果。
有没有更好的自动查找 HomeAddress 的方法?你能帮我改进一下吗?
非常感谢
【问题讨论】:
-
如果您创建外键引用,您将获得可用的地址。你没有写任何额外的代码来获取地址。
-
从个人到地址的外键是不可能的,因为可能有多个地址。额外的代码是为了确保我不必每次都迭代每个 PersonXAddress 对象来找到 HomeAddress
-
您可以使用多对多关系,这可能有助于包含两个数据库主键的第三类
-
如果一个地址可能属于多个人,如何将其键入为“家庭地址”?如果它属于拥有另一个家庭住址的其他人怎么办?也许“家庭地址”标志应该在路口记录中。
-
我还怀疑这是一个索引问题,而不是 SQL 生成问题。考虑到
SELECT中的每一列占用一行,50 行实际上并没有那么多。
标签: c# asp.net sql-server entity-framework-6 automapper