我如何可以包括使用mvc4 C#在我的LINQ倍数表实体预先加载 [英] How can I Include Multiples Tables in my linq to entities eager loading using mvc4 C#
问题描述
我有6个班,我尝试使用 LINQ
来实体,以获得最后的 SiglaUF
信息更深表(在视图 - MVC)。问题是我收到以下错误:
的ObjectContext的实例已经被处置,不能再用于需要连接的业务。
的看法是这样的:
> @model IEnumerable的< DiskPizzaDelivery.Models.EnderecoCliente>
> @foreach(以型号VAR项){
> @ Html.DisplayFor(modelItem => item.CEP.Cidade.UF.SiglaUF)
> }
块引用>这是我使用的查询:
VAR cliente = context.Clientes
.INCLUDE(E => e.Enderecos)
.INCLUDE(E1 => e1.Enderecos.Select(CEP => cep.CEP))
.SingleOrDefault();现在的问题是:我怎样才能提高此查询以pre加载(eager加载)CIDADE和UF
?请参阅类如下:
公共部分类Cliente
{
[键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)
公众诠释IdCliente {搞定;组; }
公共字符串电子邮件{获得;组; }
公共字符串Senha {搞定;组; }
公共虚拟的ICollection< EnderecoCliente> Enderecos {搞定;组; }
}
公共部分类EnderecoCliente
{
公众诠释IdEndereco {搞定;组; }
公众诠释IdCliente {搞定;组; }
公共字符串CEPEndereco {搞定;组; }
公共字符串NÚMERO{搞定;组; }
公共字符串补语{搞定;组; }
公共字符串PontoReferencia {搞定;组; }
公共虚拟Cliente Cliente {搞定;组; }
公共虚拟CEP CEP {搞定;组; }
}
公共部分类CEP
{
公共字符串CodCep {搞定;组; }
公共字符串Tipo_Logradouro {搞定;组; }
公共字符串Logradouro {搞定;组; }
公共字符串上城区{搞定;组; }
公众诠释CodigoUF {搞定;组; }
公众诠释CodigoCidade {搞定;组; }
公共虚拟CIDADE CIDADE {搞定;组; }
}
公共部分类CIDADE
{
公众诠释CodigoCidade {搞定;组; }
公共字符串NomeCidade {搞定;组; }
公众诠释CodigoUF {搞定;组; }
公共虚拟的ICollection<&CEP GT; CEP证书{搞定;组; }
公共虚拟用友{搞定;组; }
公共虚拟的ICollection< UF> UFS {搞定;组; }
}
公共部分类UF
{
公众诠释CodigoUF {搞定;组; }
公共字符串SiglaUF {搞定;组; }
公共字符串NomeUF {搞定;组; }
公众诠释CodigoCidadeCapital {搞定;组; }
公共虚拟的ICollection<&CIDADE GT; Cidades的{搞定;组; }
公共虚拟CIDADE CIDADE {搞定;组; }
}VAR cliente = context.Clientes
。凡(C => c.Email ==电子邮件)
。凡(C => c.Senha == senha)
.INCLUDE(E => e.Enderecos)
.INCLUDE(E1 => e1.Enderecos.Select(CEP => cep.CEP))
.SingleOrDefault();谢谢!
解决方案您可以简单地包括整个导航路径。
VAR cliente = context.Clientes
.INCLUDE(E => e.Enderecos)
.INCLUDE(E1 => e1.Enderecos.Select(CEP => cep.CEP.Cidade.UF))
.SingleOrDefault();I have 6 classes and I try to use
linq
to Entities to get theSiglaUF
information of the last deeper table (in the view - MVC). The problem is I receive the following error:"The ObjectContext instance has been disposed and can no longer be used for operations that require a connection."
The view is like that:
> @model IEnumerable<DiskPizzaDelivery.Models.EnderecoCliente> > @foreach (var item in Model) { > @Html.DisplayFor(modelItem => item.CEP.Cidade.UF.SiglaUF) > }
The query that i use:
var cliente = context.Clientes .Include(e => e.Enderecos) .Include(e1 => e1.Enderecos.Select(cep => cep.CEP)) .SingleOrDefault();
The question is: How Can I improve this query to pre loading (eager loading) "Cidade" and "UF"?
See below the classes:
public partial class Cliente { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int IdCliente { get; set; } public string Email { get; set; } public string Senha { get; set; } public virtual ICollection<EnderecoCliente> Enderecos { get; set; } } public partial class EnderecoCliente { public int IdEndereco { get; set; } public int IdCliente { get; set; } public string CEPEndereco { get; set; } public string Numero { get; set; } public string Complemento { get; set; } public string PontoReferencia { get; set; } public virtual Cliente Cliente { get; set; } public virtual CEP CEP { get; set; } } public partial class CEP { public string CodCep { get; set; } public string Tipo_Logradouro { get; set; } public string Logradouro { get; set; } public string Bairro { get; set; } public int CodigoUF { get; set; } public int CodigoCidade { get; set; } public virtual Cidade Cidade { get; set; } } public partial class Cidade { public int CodigoCidade { get; set; } public string NomeCidade { get; set; } public int CodigoUF { get; set; } public virtual ICollection<CEP> CEPs { get; set; } public virtual UF UF { get; set; } public virtual ICollection<UF> UFs { get; set; } } public partial class UF { public int CodigoUF { get; set; } public string SiglaUF { get; set; } public string NomeUF { get; set; } public int CodigoCidadeCapital { get; set; } public virtual ICollection<Cidade> Cidades { get; set; } public virtual Cidade Cidade { get; set; } } var cliente = context.Clientes .Where(c => c.Email == email) .Where(c => c.Senha == senha) .Include(e => e.Enderecos) .Include(e1 => e1.Enderecos.Select(cep => cep.CEP)) .SingleOrDefault();
Thanks!
解决方案You can simply include the entire navigation path.
var cliente = context.Clientes .Include(e => e.Enderecos) .Include(e1 => e1.Enderecos.Select(cep => cep.CEP.Cidade.UF)) .SingleOrDefault();
这篇关于我如何可以包括使用mvc4 C#在我的LINQ倍数表实体预先加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!