C# 如何使用LINQ中的投影将实体转换为DTO类

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() {

我有Linq脚本,我想使用projection类将数据获取到DTO类型。我得到了lambda expersion的示例,但是在LINQ脚本上出现了错误

Linq脚本:

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);