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