解决方案: 想法是加载问题来自表文件。因此,为了使所有内容按顺序排列,我必须关闭延迟加载,并使用blob从实体加载导航属性,而不是相反。
public FileDto[] RetrieveFilesWithUserId(string id)
{
FileDto[] files;
logger.Info("Looking for files #{0}", id);
using (var db = ContextFactory.GetEntities())
{
db.Configuration.LazyLoadingEnabled = false;
logger.Debug("User retrieved !");
files = db.Files.Include("Users").Where(f => f.Users.Count(user1 => user1.Id == id) > 0).Select(
x =>
new FileDto
{
ContentType = x.ContentType,
Id = x.Id,
Name = x.Name,
Type = db.TypeFiles.FirstOrDefault(b => b.Id == x.Type).Description
}).ToArray();
db.Configuration.LazyLoadingEnabled = true;
}
logger.Info("done looking for files");
return files;
}
问题是: 我有一个看起来很经典的问题。 我有一个包含一个大blob的表,当我加载它时,我遇到了巨大的性能问题(由于加载了大量数据)。
我有用户,那些用户有文件,在我的文件实体中我有数据。 关系很多很多。
轻松修复:我做了一些表拆分,我的所有问题都解决了。
问题:我的老板不希望我这样做(我认为这是最好的选择)。
那么,我该怎么做呢? 我想直接要求但我没有访问中间表(它们现在是导航属性。) 一个程序会成功吗?
答案 0 :(得分:0)
您可以使用投影获取所需的所有字段而不使用blob:
var people = context.People.Select(p => new PersonDTO { Id = p.Id, Name = p.Name });
PersonDTO就像:
class ProductDTO
{
public int Id { get; set; }
public string Name { get; set; }
}
DTO表示Data Transfer Object,它通常用于此类任务。