C# 如何使用LINQ中的投影将实体转换为DTO类
我有Linq脚本,我想使用projection类将数据获取到DTO类型。我得到了lambda expersion的示例,但是在LINQ脚本上出现了错误 Linq脚本:C# 如何使用LINQ中的投影将实体转换为DTO类,c#,.net,linq,entity-framework-projection,C#,.net,Linq,Entity Framework Projection,我有Linq脚本,我想使用projection类将数据获取到DTO类型。我得到了lambda expersion的示例,但是在LINQ脚本上出现了错误 Linq脚本: public class EziTransactionDto { ... other properties public static Expression<Func<EziTransactionEntity, EziTransactionDto>> Projection() {
public class EziTransactionDto
{
... other properties
public static Expression<Func<EziTransactionEntity, EziTransactionDto>> Projection()
{
return eziTransactionDto => new EziTransactionDto
{
EziTransactionId = eziTransactionDto.Id,
LoginSiteID = eziTransactionDto.LoginSiteID,
WorkCodes = eziTransactionDto.WorkCodes
};
}
公共类EziTransactionDto
{
……其他财产
公共静态表达式投影()
{
返回eziTransactionDto=>new eziTransactionDto
{
EziTransactionId=eziTransactionDto.Id,
LoginSiteID=eziTransactionDto.LoginSiteID,
工作代码=eziTransactionDto.WorkCodes
};
}
Linq查询:
var ts = (from transaction in _eziTransactionRepository.GetAll<EziTransactionEntity>()
where transaction.LoginErrorCode != 0
select transaction
).Select(EziTransactionDto.Projection);
var ts=(来自eziTransactionRepository.GetAll()中的事务)
其中transaction.LoginErrorCode!=0
选择事务
).选择(EziTransactionDto.投影);
错误:
我想这里的关键词
表达式是奇怪的
试试这个:
// public static Expression<Func<EziTransactionEntity, EziTransactionDto>> Projection()
public static Func<EziTransactionEntity, EziTransactionDto> Projection()
{
return eziTransactionDto => new EziTransactionDto
{
EziTransactionId = eziTransactionDto.Id,
LoginSiteID = eziTransactionDto.LoginSiteID,
WorkCodes = eziTransactionDto.WorkCodes
};
}
//公共静态表达式投影()
公共静态Func投影()
{
返回eziTransactionDto=>new eziTransactionDto
{
EziTransactionId=eziTransactionDto.Id,
LoginSiteID=eziTransactionDto.LoginSiteID,
工作代码=eziTransactionDto.WorkCodes
};
}
我想知道答案
public static Expression<Func<EziTransactionEntity, EziTransactionDto>> Projection
{
get
{
return eziTransactionDto => new EziTransactionDto
{
EziTransactionId = eziTransactionDto.Id,
LoginSiteID = eziTransactionDto.LoginSiteID,
WorkCodes = eziTransactionDto.WorkCodes
};
}
}
公共静态表达式投影
{
收到
{
返回eziTransactionDto=>new eziTransactionDto
{
EziTransactionId=eziTransactionDto.Id,
LoginSiteID=eziTransactionDto.LoginSiteID,
工作代码=eziTransactionDto.WorkCodes
};
}
}
var ts=(来自eziTransactionRepository.GetAll()中的事务)
选择事务
).Select(EziTransactionDto.Projection).ToList();
在第一次选择后,您的IQueryable已经将数据提取到本地进程,并使其成为IEnumerable
您可以在Select语句中执行此转换:
var eziTransactionDtos = _eziTransactionRepository.EziTransactionEntities
.Where(eziTransactionEntity => eziTransationEntity.LoginErrorCode != 0)
.Select(eziTransactionEntity => new EziTransactionDto
{
EziTransactionId = eziTransactionDto.Id,
LoginSiteID = eziTransactionDto.LoginSiteID,
WorkCodes = eziTransactionDto.WorkCodes,
});
但是,如果需要在多个位置将EziTransactionEntities转换为EziTransactionDTO,最好为IQueryable
创建一个可重用的扩展方法
如果您不熟悉扩展方法,请参阅
可重复使用:
var transactionWithoutWorkCodes = eziTransactionRepository.EziTransactionEntities
.Where(eziTransactionEntity => eziTransationEntity.WorkCode == null)
.ToEziTransactionDtos();
易于进行单元测试:
List<EziTransactionEntity> testItems = ...
List<EziTransactionDto> expectedResults = ...
var testResults = testItems.AsQueryable().ToEziTransactionDtos();
Assert.AreQual(expectedResults, testResults, unorderedTransactionsComparer);
列表测试项=。。。
列出预期的结果=。。。
var testResults=testItems.AsQueryable().ToEziTransactionDtos();
AreQual(预期结果、测试结果、无序事务比较程序);
易于维护:如果您添加/删除/更改此转换的一个属性,您只需在一个位置执行此操作投影是一种方法…将其用作方法而不是字段如果无法回答为什么为负数..这是无效的问题..选择(EziTransactionDto.Projection)
选择(EziTransactionDto.Projection())
。。。
var eziTransactionDtos = eziTransactionRepository.EziTransactionEntities
.Where(eziTransactionEntity => eziTransationEntity.LoginErrorCode != 0)
.ToEziTransactionDtos();
var transactionWithoutWorkCodes = eziTransactionRepository.EziTransactionEntities
.Where(eziTransactionEntity => eziTransationEntity.WorkCode == null)
.ToEziTransactionDtos();
List<EziTransactionEntity> testItems = ...
List<EziTransactionDto> expectedResults = ...
var testResults = testItems.AsQueryable().ToEziTransactionDtos();
Assert.AreQual(expectedResults, testResults, unorderedTransactionsComparer);