如何在 C# 中将 Linq 结果传递给扩展方法,错误消息:无法从匿名类型转换为 DTO

How to pass Linq Result to Extension Method in c# , error message: Cannot Convert from Anonymous type to DTO

下面是我的 Linq 查询,我正在为我的模型创建扩展方法。

  var result = (from de in objEntities.Devices.AsEnumerable()
                          join ds in objEntities.DataSources
                          on de.DataSourceID equals ds.DataSourceID
                          where de.Name == DeviceId && ds.Deleted == false
                          select new  { DeviceName = de.Name, DataSourceName= ds.Name,Instance= ds.Instance }).SingleOrDefault();

这里是如何将 Linq 结果传递给扩展方法

objDTO= AuthenticationDTOTransformers.ToDTO(result);

扩展方法

public static class AuthenticationDTOTransformers
    {
        public static AuthenticationDTO ToDTO(this AuthenticateModel model)
        {
            if (model == null) { return null; }
            var dto = new AuthenticationDTO();
            ToDTO(model, dto);
            return dto;
        }
}

错误:

无法从匿名类型转换为 DTO

错误消息是不言自明的,您正在将匿名类型传递给方法,因此会出现错误。创建自定义类型并像这样传递它:-

class Device
{
    public string DeviceName  {get; set; }
    public string DataSourceName{get; set; }
    public string Instance{get; set; }
}

在您的查询中,投影类型:-

select new Device { DeviceName = de.Name, DataSourceName= ds.Name,Instance= ds.Instance }

最后你的方法应该是这样的:-

 public static AuthenticationDTO ToDTO(this AuthenticateModel model, Device device)

根据上面的定义,您可以在 AuthenticateModel 对象上调用 ToDTO 方法并将 Device 对象作为参数传递。

而不是 return 从 select 获取匿名类型,您需要 return 一个您想要扩展的类型。在这里,您正在扩展 AuthenticateMode class,因此来自 select 的 return AuthenticateMode 实例如下所示。

var result = (from de in objEntities.Devices.AsEnumerable()
                      join ds in objEntities.DataSources 
                      on de.DataSourceID equals ds.DataSourceID
                      where de.Name == DeviceId && ds.Deleted == false
                      select new AuthenticateMode { DeviceName = de.Name, DataSourceName = ds.Name, Instance = ds.Instance })
                      .SingleOrDefault();

然后将您的扩展方法调用为

objDTO = result.ToDTO();