如何将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
答
错误消息是不言自明的,要传递匿名类型的方法和由此的误差。创建一个自定义类型,并将它传递这样的: -
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();
你的LINQ创建一个匿名的对象,而不是一个'AuthenticateModel'。另外,你并没有像扩展方法那样使用它,尽管希望这是为了调试目的。 – krillgar
请在问题的正文中提供错误消息的文本作为文本。 –
这是字面上告诉你什么是人的问题。只有当所有的错误信息都是这样的信息。 –