2

表現に問題がある

私はエンティティを持っています

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 によって 1 つの解決策が提案されました。

Expression<Func<T, DateTime>> を Expression<Func<T, object>> にキャストする方法

しかし、この解決策では、DTOUser から User に各値をマップする必要があるように思われるため、DTOUser に 15 を超えるプロパティが含まれているため、これにより複雑になることはありません。

誰かが私を助けることができますか?

4

2 に答える 2

2

あるタイプから別のタイプに直接キャストすることはできません。次のことができます。

  1. 手動マッピング
  2. リフレクションを使用して自動的にマップします (プロパティ名が同じであるため)
  3. 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;
}

同じタイプと名前のプロパティをコピーします

于 2012-11-29T12:16:50.547 に答える
0

リンクからJon Skeetの回答を使用し、User(部分)クラスでDTOUserからUserへの明示的なキャストを定義できると思います:

public static explicit operator User(DTOUser dto)
{
    return new User
    {
        Prop1 = dto.Prop1,
        Prop2 = dto.Prop2,
        ...
    }
}
于 2012-11-29T12:21:27.177 に答える