我可以将查询结果投影到EF生成的模型中吗

本文关键字:模型 EF 查询 结果 投影 我可以 | 更新日期: 2023-09-27 17:59:03

我有一个类似以下的方法:

 public IEnumerable<CountryEF> GetAllCountry( )
    {

        using (Context context  = new Context() )
        {
            List<CountryEF> countries = context.COUNTRY.Select(c =>
                 new CountryEF()
                 {
                     ID = c.ID,
                     Description = c.DESCRIPTION,
                     CURRENCYEF = c.CURRENCYEF
                 }
            ).ToList<CountryEF>();
            return countries;
        }

    }

其中,COUNTRYEF是由实体框架生成的模型类,如下所示:

public partial class COUNTRYEF
{
    public COUNTRYEF()
    {
    }
    public string ID { get; set; }
    public string DESCRIPTION { get; set; }
    public virtual CURRENCY CURRENCYEF { get; set; }
}

每当我这样做的时候,我都会得到例外。因此,作为后备,我必须创建另一个类,它只是上面类的复制粘贴,如下所示:

    public class COUNTRYVM //view model class
    {
        public COUNTRYVM()
        {
        }
        public string ID { get; set; }
        public string DESCRIPTION { get; set; }
        public virtual CURRENCY CURRENCYEF { get; set; }
    }

然后我的查询变成这样:

    public IEnumerable<CountryVM> GetAllCountry( )
    {

        using (Context context  = new Context() )
        {
            List<CountryVM> countries = context.COUNTRY.Select(c =>
                 new CountryVM()
                 {
                     ID = c.ID,
                     Description = c.DESCRIPTION,
                     CURRENCYEF = c.CURRENCYEF
                 }
            ).ToList<CountryVM>();
            return countries;
        }
    }

上述解决方案运行良好。但是,我真的想把实体框架(如public partial class COUNTRYEF)生成的Model类复制到public class COUNTRYVM之类的东西上吗。我真的不想做代码复制。

对此有什么可能的解决方案?匿名属性也不会。我尝试了以下解决方案:

   public IEnumerable GetAllCountry( )
    {

        using (Context context  = new Context() )
        {
            var countries = context.COUNTRY.Select(c =>
                 new  //Anonymous Projection 
                 {
                     ID = c.ID,
                     Description = c.DESCRIPTION,
                     CURRENCYEF = c.CURRENCYEF
                 }
            ).ToList();
            return countries;
        }
    }

但是,我无法访问我的视图和控制器中的ID、说明和CurrencyEF!!

我可以将查询结果投影到EF生成的模型中吗

Entity Framework不允许在其投影中创建Entity的类。它很难跟踪应该跟踪的实体。我使用的工作。不复制和粘贴类,只将其子类化。

public partial class CountryEFSub : CountryEF
{
}

public IEnumerable<CountryEF> GetAllCountry( )
{
    using (Context context  = new Context() )
    {
        return context.COUNTRY.AsNoTracking().Select(c =>
             new CountryEFSub()
             {
                 ID = c.ID,
                 Description = c.DESCRIPTION,
                 CURRENCYEF = c.CURRENCYEF
             }
        ).AsEnumerable();
    }
}

这个骗局在EF 5中奏效了。我还没有和其他版本一起使用过。还注意到,您可以将方法类型保留为CountryEF。

您可以创建一个T4来为您创建所有的子类。此外,如果您需要投影方面的帮助,我相信AutoMapper现在支持IQueryable。否则,您可以手动或用表达式在树上编写投影。