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

C# 我可以将查询结果投影到EF生成的模型吗?,c#,.net,asp.net-mvc,linq,entity-framework,C#,.net,Asp.net Mvc,Linq,Entity Framework,我有一个方法如下: public IEnumerable<CountryEF> GetAllCountry( ) { using (Context context = new Context() ) { List<CountryEF> countries = context.COUNTRY.Select(c => new CountryEF()

我有一个方法如下:

 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;
        }


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

    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 partial class COUNTRYEF
{
    public COUNTRYEF()
    {

    }

    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;
        }

    }

但是我无法访问视图和控制器中的ID、描述和currencyRef

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

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();
    }
}
public分部类CountryEFSub:CountryEF
{
}
公共IEnumerable GetAllCountry()
{
使用(上下文=新上下文())
{
返回context.COUNTRY.AsNoTracking().Select(c=>
新国家
{
ID=c.ID,
描述=c.描述,
CURRENCYEF=c.CURRENCYEF
}
).AsEnumerable();
}
}
这个骗局在EF5中奏效了。我没有在其他版本中使用它。还注意到您可以将方法类型保留为CountryEF


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

您的第一部分应该是
List countries=context.COUNTRY.ToList()。请更详细地说明您遇到的错误。@henkHolterman:不包含上下文。Country.ToList()返回所有列。如果我只需要几列,该怎么办。我得到了为什么匿名类型不起作用的答案。第一次尝试时会出现什么异常?如果不需要所有列,应该创建一个视图模型。不要使用半生不熟的实体。在消费端,您必须始终注意哪些属性不能使用。我认为这是一个糟糕的“解决方案”。它仍然有复制类的所有缺点(OP明确地试图避免),也没有专用视图模型的优点。我只是想指出那份遗产!=复制。就像声誉一样!=learning@Gert阿诺:让人冷静。我只是在努力学习。我认为任何解决方案都不可怕。说起来有点刺耳。
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();
    }
}