我认为必须提出相同的问题,但我只是不知道如何正确地描述它。
我正在使用Entity Framework,并且有一个名为vendor的表,该表包含许多列:
[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的上下文对象现在具有一个名为vendor的属性。然后,在API控制器中,我这样编码:
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();
更新:
根据@Andrew的回答,我更新了我的代码,如下所示:
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'
我错过了什么?至于显式转换,我将必须在循环中显式转换每个实例?
基本上,您有3种方法来实现要达到的目标。
.Select()
linq扩展方法来创建投影(如您的上一个示例所示)。通常,这是一个不错的选择,因为这将创建一个SQL表达式,该表达式仅返回数据传输对象所需的字段。public static implicit Operator OM_Vendor(Vendor vendor)
,它接受一个完整的Vendor
对象并将其分配给的实例OM_Vendor
。这里的主要缺点是,您本质上是通过Entity Framework检索所有字段,而只是将实体展平并在隐式强制转换期间丢弃其中的许多字段。一个更完整的代码示例来演示:
public class OM_Vendor {
...
public static implicit Operator OM_Vendor(Vendor vendor){
return new OM_Vendor {
Id = vendor.Id;
Name = vendor.Name;
ApiUrl = vendor.ApiUrl;
}
}
OM_Vendor om_Vendor = this.objEntity.vendors.Where(
...
List<OM_Vendor> vendors = this.objEntity.vendors.Where(
...
implicit Operator
将Vendor
实例分配给时,使用构造函数将这两个语句中的任何一条正确执行OM_Vendor
。但是,不能夸大其词,这是在代码级展平对象,并且将导致超出必要的SQL查询。
实际上,这应该是一个显式运算符,因为在转换过程中会发生数据丢失。更改implicit Operator
为explicit Operator
会导致此转换需要强制转换,即OM_Vendor omVendor = (OM_Vendor)vendor;
。这样可以更清楚地知道正在发生转换,但是会使代码更加冗长。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句