如何在 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();
下面是我的 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();