我在ADO.NET上使用导航属性和继承时遇到了一些问题。
这是我的数据模型:
首先,一些词汇:
分类=类别
Formulario =表格
Campo = Field
Imagem =图像
Paragrafo =段落
Escolha =选择
Texto =文字
Resposta =答案
所以,我正在尝试在Form上创建一个自定义属性,返回它的答案数。
正常的做法(我认为)将是:
public partial class Formulario
{
public int Respostas
{
get
{
List<Item> itens = this.Itens.ToList();
IEnumerable<Campo> campos = from m in itens where m as Campo != null select (Campo)m;
int soma = campos.Sum(m => m.Respostas.Count);
return soma;
}
}
}
但它不起作用。 itens
列表返回0个元素。但是当我这样做时,它会返回它应该的4个项目:
public partial class Formulario
{
public int Respostas
{
get
{
FormulariosDB db = new FormulariosDB();
List<Item> itens = db.Items.Where(m => m.Formulario.Id == this.Id).ToList();
IEnumerable<Campo> campos = from m in itens where m as Campo != null select (Campo)m;
int soma = campos.Sum(m => m.Respostas.Count);
return soma;
}
}
}
仅在我实例化整个数据模型时才有效。有谁知道为什么?
PS:我正在使用.toList()
方法,因此我可以使用所有Linq
次查询,而不仅Linq2Entities
允许我查询
答案 0 :(得分:2)
我猜你正在使用Entity Framework 1,或者你没有在Entity Framework 4中启用延迟加载。
在您的课程中,您期望加载Itens集合。情况并非总是如此,因为只有在从数据库中检索出Formulario对象时才显式地加载集合时才会加载集合。
你需要添加两行代码,一切都应该好了:
if(!Itens.IsLoaded)
Itens.Load();
List<Item> itens = Itens.ToList();