我是第一次在WebAPI服务中使用EF 4。我理解EF的基础知识,但是当我习惯使用ADO时,它仍然是一个学习曲线。
我只想返回表格中超过100个字段的子集(5)。
模型(EF生成):
public partial class ITEM_MASTER
{
public string IM_ITEM_CODE { get; set; }
public string IM_UPC { get; set; }
public string IM_SUBDEPARTMENT { get; set; }
public string IM_DESC { get; set; }
...
}
在我的控制器中获取方法:
// GET api/Products
public IQueryable<ITEM_MASTER> GetProduct()
{
// return db.ITEM_MASTER;
return db.ITEM_MASTER.Select(x => new ProductList { ItemCode = x.IM_ITEM_CODE });
}
return db.ITEM_MASTER
有效,但使用.Select方法我收到错误:
无法隐式转换类型
'System.Linq.IQueryable<JWebAPI.Models.ProductList>'
来'System.Linq.IQueryable<JWebAPI.Models.ITEM_MASTER>'
。一个明确的 存在转换(你错过了演员吗?)
public class ProductList
{
public string ItemCode {get; set;}
}
ProductList类充当占位符对象,因为使用.Select返回的是DBQuery而不是原始对象类型。我读到这是处理这种情况的理想方式。当我开始工作时,我会为它添加更多属性。我有一个下载的样本,其结构相同,并且有效。
这是做我需要的最好方法,只返回EF字段的一部分吗?如何解决转换错误?
答案 0 :(得分:3)
错误很明显,您的方法假设返回IQueryable<ITEM_MASTER>
,但您尝试返回'System.Linq.IQueryable<JWebAPI.Models.ProductList>'
。
由于您将查询的结果投影到'System.Linq.IQueryable<JWebAPI.Models.ProductList>'
,因此您需要将其作为返回类型。
// GET api/Products
public IQueryable<ProductList> GetProduct() //Change return type
{
// return db.ITEM_MASTER;
return db.ITEM_MASTER.Select(x => new ProductList { ItemCode = x.IM_ITEM_CODE });
}
由于您只选择原始实体的一个子集,因此您无法投影到实体框架中映射到表的实体,这就是您需要占位符类ProductList