我有一个关于使用 Entity Framework 进行预测的问题。
我有三张表:
简介、传记和传记翻译
我想做以下投影:(传记 = IQueryable)
return biographies.Select(b => new ProfileBiography
{
Id = b.BiographieID,
OwnerId = b.Profile.ProfileID,
Translations =
b.Translations.Select(t => new DocumentTranslation()
{
DocumentId = b.BiographieID,
FileName = t.BiographyTextFile,
Title = t.Title,
Text = t.Text,
LanguageId = t.LanguageID
})
}
我的问题:
OwnerId 投影正确,但翻译次数始终为 0。
投影对集合属性不起作用吗?
我也试过 biographies.Inlcude("Translations"),但结果是一样的。
更新
我创建了一个小的测试项目,你可以在这里找到:
TestProject.zip
只有 3 个表(包括创建和插入语句)、一个 EDMX 文件和一个加载传记的类。我仍然无法让它工作来投影集合导航属性,简单的导航属性工作正常。也许有人可以从测试项目中看出我做错了什么......
更新
我尝试了一种新方法,但仍然没有运气:
using (var context = new DatabaseEntities())
{
return context.BiographySets
.Where(bio => bio.ProfileId == profileId)
.Select(bio => new DocumentModel()
{
Id = bio.Id,
OwnerId = bio.Profile.Id,
Translations = context.BiographyTranslationSets.Where(t => t.BiographyId == bio.Id)
.Select(t => new DocumentTranslation()
{
DocumentId = bio.Id,
LanguageId = t.LanguageId,
Text = t.Text
})
}).ToList();
}
更新
如果我使用匿名类型,它会令人惊讶地工作......
using (var context = new DatabaseEntities())
{
return context.BiographySets
.Where(bio => bio.ProfileId == profileId)
.Select(bio => new
{
Id = bio.Id,
OwnerId = bio.Profile.Id,
Translations = bio.Translations
.Select(t => new
{
DocumentId = bio.Id,
LanguageId = t.LanguageId,
Text = t.Text
})
}).ToList();
}
最佳答案
好的,我发现了问题:
这是我的 DocumentModel 类:
public class DocumentModel
{
public DocumentModel()
{
_translations = new List<DocumentTranslation>();
}
public int Id { get; set; }
public int OwnerId { get; set; }
private List<DocumentTranslation> _translations;
public IEnumerable<DocumentTranslation> Translations
{
get { return _translations; }
set { _translations = value.ToList(); }
}
}
这就是问题所在:
set { _translations = value.ToList(); }
我不能在我的 Setter 中调用 ToList() 因为它会破坏查询。
关于c# - 使用 Entity Framework 进行投影,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11225039/