我认为必须提出同样的问题,但我不知道如何正确描述它。如何将查询结果中的对象转换为自定义类型
我使用实体框架,我有一个叫做供应商的表,由许多列:
[vendor]
- [Id] [INT]
- [Name] [NVARCHAR]
- [ApiUrl] [NVARCHAR]
- ...
我写一个Web API来公开哪些用户可以通过获取供应商记录的功能。但是,我只想提供三列。
所以我创建了一个模型类,如下:
public class OM_Vendor
{
public int Id { set; get; }
public string Name { set; get; }
public string ApiUrl { set; get; }
}
与EF建立模型类之后,EF的上下文对象有一个现在被命名为供应商属性。然后,在API控制器,I编码是这样的:
var vendors = this.objEntity.vendors
.Where<OM_Vendor>(v => v.Status == "1")
.OrderBy(v => v.Id)
.Skip(intSkip)
.Take(intLimit)
.ToList();
它不工作,也不做这个的:
var vendors = this.objEntity.vendors
.Where(v => v.Status == "1")
.OrderBy(v => v.Id)
.Skip(intSkip)
.Take(intLimit)
.ToList<OM_Vendor>();
有没有办法通过类似上面的方法返回的对象转换我的自定义类型?
非常感谢。
另外,我知道我能得到它以这种方式工作:
var vendors = new List<OM_Vendor>();
vendors = objCont.ExecuteStoreQuery<OM_Vendor>("SELECT * FROM vendor").ToList();
而且这种方式也工作:
var vendors = this.objCont.vendors
.Where(v => v.Status == "1")
.OrderBy(v => v.Id)
.Select(
row => new
{
Id= row.Id,
Name = row.Name,
ApiUrl = row.ApiUrl
}
)
.Skip(intSkip)
.Take(intLimit)
.ToList();
更新:
根据@安德鲁的回答,我更新了我的鳕鱼Ë如下:
public class OM_Vendor
{
public int Id { set; get; }
public string Name { set; get; }
public string ApiUrl { set; get; }
public static implicit operator OM_Vendor(vendor vendor){
return new OM_Vendor
{
Id = vendor.Id,
Name = vendor.Name,
ApiUrl = vendor.ApiUrl
};
}
}
在我的控制器类:
List<OM_Vendor> vendors = this.objCont.vendors
.Where(v => v.Status == "1")
.OrderBy(v => v.Id)
.Skip(intSkip)
.Take(intLimit)
.ToList();
我得到了错误,说:
无法隐式转换类型 'System.Collections.Generic.List' 来 'System.Collections.Generic.List'
我错过了什么?至于显式演员,我将不得不在每个循环中显式地转换每个实例?
所以使用投影有什么问题?好像你问是否有不同的方式来完成这一点,因为你说它的工作方式...... – Claies 2014-11-21 04:20:12
我的问题是,我可以做投影而不执行SQL语句吗?只需使用我的自定义类型OM_Vendor从供应商集合直接进行投影即可。 – VincentZHANG 2014-11-21 06:08:44