我可以将查询结果投影到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!!
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。否则,您可以手动或用表达式在树上编写投影。