如何将查询结果中的对象转换为自定义类型

张文森

我认为必须提出相同的问题,但我只是不知道如何正确地描述它。

我正在使用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种方法来实现要达到的目标。

  1. 使用.Select()linq扩展方法来创建投影(如您的上一个示例所示)。通常,这是一个不错的选择,因为这将创建一个SQL表达式,该表达式仅返回数据传输对象所需的字段。
  2. 创建一个自定义的强制转换运算符,例如public static implicit Operator OM_Vendor(Vendor vendor),它接受一个完整的Vendor对象并将其分配给的实例OM_Vendor这里的主要缺点是,您本质上是通过Entity Framework检索所有字段,而只是将实体展平并在隐式强制转换期间丢弃其中的许多字段。
  3. 使用自定义库(例如Automapper)来自动执行对象转换过程。遭受与2相同的大多数问题,但是如果您要平化许多类,则由库处理它可能会有所帮助。

一个更完整的代码示例来演示:

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 OperatorVendor实例分配给时,使用构造函数将这两个语句中的任何一条正确执行OM_Vendor但是,不能夸大其词,这是在代码级展平对象,并且将导致超出必要的SQL查询。

实际上,这应该是一个显式运算符,因为在转换过程中会发生数据丢失。更改implicit Operatorexplicit Operator会导致此转换需要强制转换,即OM_Vendor omVendor = (OM_Vendor)vendor;这样可以更清楚地知道正在发生转换,但是会使代码更加冗长。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将自定义类型转换为原始类型?

如何将对象数组转换为自定义类对象(即数组到对象)?

如何将类型转换定义为自定义类型的字符串

如果包装对象,将Golang转换为自定义类型会失败

如何将接口转换为自定义类型

如何将JSON对象转换为自定义C#对象?

如何在Swift 5中将文档转换为自定义对象?

如何将Newton.Json反序列化的通用对象转换为自定义对象?

NetSuite自定义记录搜索将结果转换为.NET对象列表

如何将XNode强制转换为自定义类型?

如何将消息从套接字流源转换为自定义域对象?

在SELECT查询中转换为自定义类型

如何将抖动的BLoC流快照转换为自定义对象?

使用LINQ将分层结果集转换为自定义对象

打字稿:如何将特定的库方法转换为自定义类型定义

如何将Fsharp中的自定义类型转换为JSON字符串?

如何将sql返回值转换为自定义对象?

Datagridview如何将选定的行强制转换为自定义对象

如何将字符串转换为自定义数据类型

如何将LRESULT转换为自定义结构类型?

将 AngularFIre 结果的结果转换为自定义类型并使其可迭代

Python 如何将现有的本机 dict 转换为自定义 dict 对象?

如何将 IQueryable/IEnumerable 结果转换为自定义模型 C# EntityFramework

如何将“游戏对象转换为自定义类”

类型错误:无法将 undefined 或 null 转换为自定义 Hooks 中发生的对象

如何将自定义类型定义文件转换为 npm 类型定义文件

如何将javascript动态数组转换为具有自定义键名的多个对象的数组

如何将字符串数组转换为自定义嵌套对象

如何将 JSON 对象转换为自定义 C# 类型对象?