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

问题描述:

下面是我的Linq查询,我正在为我的模型创建扩展方法。如何将Linq结果传递给c#中的扩展方法,错误消息:无法从匿名类型转换为DTO

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

enter image description here

+0

你的LINQ创建一个匿名的对象,而不是一个'AuthenticateModel'。另外,你并没有像扩展方法那样使用它,尽管希望这是为了调试目的。 – krillgar

+0

请在问题的正文中提供错误消息的文本作为文本。 –

+1

这是字面上告诉你什么是人的问题。只有当所有的错误信息都是这样的信息。 –

错误消息是不言自明的,要传递匿名类型的方法和由此的误差。创建一个自定义类型,并将它传递这样的: -

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对象作为参数。

而不是从select中返回匿名类型,你需要返回一个你想要扩展的类型。在这里你正在扩展AuthenticateMode类,所以如下所示从select中返回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();