我的表情有问题

我有一个实体

public class User{
public string Username{get;set;}
  public int PhoneNumber{get;set;}
  public string FIrstName{get;set;}
  public string LastName{get;set;}
}


我有一个DTO

public class DTOUser{
  public string Username{get;set;}
  public int PhoneNumber{get;set;}
  public string FIrstName{get;set;}
  public string LastName{get;set;}
  }


然后我有一个通用的代码段

 public IList<DTOUser> SelectAll(Expression<Func<DTOUser, bool>> predicate)
    {
           using (var adc = _conn.GetContext())
        {
       // what should I do ?? so i can convert Predciate to get all values from Users (Entity)
//it generates an error because predicate can't be cast into Entity User
 //   var users = adc.Users.All(predicate);
       }
    }


我想通过传递LAMBDA表达式获取DTOUser的列表

accountrepo.SelectAll( user => user.firstname.equals ("sample"));


我研究了这个问题,并得出结论,由于DTOUser和User是不同类型的,因此很难将Expression从一种类型转换为另一种类型。

乔恩·斯凯特(Jon Skeet)提出了一种解决方案:

How to cast Expression<Func<T, DateTime>> to Expression<Func<T, object>>

但由于此解决方案似乎需要将DTOUser的每个值映射到User,这并不会使它变得更加复杂,因为我的DTOUser包含超过15个属性。

有人可以帮我吗?

最佳答案

您不能直接从一种类型转换为另一种类型,可以这样做:


手动映射
使用反射自动映射(因为属性名称相同)
使用AutoMapper


对于使用反射的映射,可以使用以下通用代码:

public static T1 CopyProperties<T1, T2>(T2 model)
    where T1 : new()
    where T2 : new()
{
    // Get all the properties in the model
    var type = model.GetType();
    var properties = type.GetProperties();

    var result = new T1();
    var resultType = result.GetType();
    var resultProperties = resultType.GetProperties();

    // Loop through each property
    foreach (var property in properties)
    {
        var resultProperty = resultProperties.FirstOrDefault(n => n.Name == property.Name && n.PropertyType == property.PropertyType);
        if (resultProperty != null)
        {
            resultProperty.SetValue(result, property.GetValue(model, null), null);
        }
    }
    return result;
}


它将复制具有相同类型和名称的属性

08-25 02:23