我如何可以包括使用mvc4 C#在我的LINQ倍数表实体预先加载 [英] How can I Include Multiples Tables in my linq to entities eager loading using mvc4 C#

查看:109
本文介绍了我如何可以包括使用mvc4 C#在我的LINQ倍数表实体预先加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有6个班,我尝试使用 LINQ 来实体,以获得最后的 SiglaUF 信息更深表(在视图 - MVC)。问题是我收到以下错误:

的ObjectContext的实例已经被处置,不能再用于需要连接的业务。

的看法是这样的:


 > @model IEnumerable的< D​​iskPizzaDelivery.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 {搞定;组; }
    }
公共部分类CID​​ADE
    {
        公众诠释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 the SiglaUF 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆