转换表达式<func <dtouser,bool =“”>&gt;谓词到表达式<func <user,bool =“”>&gt;谓词</FUNC <用户,> </FUNC <dtouser,>

时间:2012-11-29 12:12:12

标签: c# expression predicate

我在Expression

中遇到了问题

我有一个实体

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个属性。

有人能帮助我吗?

2 个答案:

答案 0 :(得分:2)

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

  1. 手动映射
  2. 使用反射自动映射(因为名称相同)
  3. 使用AutoMapper
  4. 对于使用反射进行映射,您可以使用以下通用代码:

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

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

答案 1 :(得分:0)

我认为你可以使用你链接中的Jon Skeet的回答,并在你的用户(部分)类中定义从DTOUser到User的显式转换:

public static explicit operator User(DTOUser dto)
{
    return new User
    {
        Prop1 = dto.Prop1,
        Prop2 = dto.Prop2,
        ...
    }
}