2017-03-28 5 views
0

述語式から汎用型Tを解析し、別の型に変換して変換型を使用して新しい式を作成できますか?式関数:汎用型T述語

私はTからDTO.Companyへの変換を行っています。その後、DTO.CompanyからDAL.Companyへのマッピングを行う必要があります。以下のコード例では変換をしようとしていますが、まずそれが可能であることを知る必要があります。次に、bar変数を設定する前にDTO.CompanyをDAL.Companyに変換する方法を知る必要があります。

// This works!!!! But I want to make it generic as possible! 
    public T Fetch<T>(Expression<Func<DAL.Company, bool>> predicate) where T : class 
    { 
     var typeOfT = typeof(T); 
     if (typeOfT != typeof(DTO.Company)) 
     { 
      return null; 
     }   
     var companies = _dbContext.Companies.Where(predicate);  

     var ret = new Collection<DTO.Company>(); 
     foreach (var company in companies) 
     { 
      ret.Add(company.ConvertToDataTransferObject()); 
     } 
     return (T)Convert.ChangeType(ret, typeof(T)); 
    } 

    // This does not work!!! 
    public T Fetch<T>(Expression<Func<T, bool>> predicate) where T : class 
    { 
     var typeOfT = typeof(T); 
     if (typeOfT != typeof(DTO.Company)) 
     { 
      return null; 
     } 
     var foo = Expression.Convert(predicate.Body, typeof(bool)); 


    //Below I'm getting Exception thrown: 'System.ArgumentException' in System.Core.dll 
    //Additional information: ParameterExpression of type 'DTO.Company' cannot be used for delegate parameter of type 'DAL.Company' 

     var bar = Expression.Lambda<Func<DAL.Company, bool>>(foo, predicate.Parameters); 
     var companies = _dbContext.Companies.Where(bar); 

     var ret = new Collection<DTO.Company>(); 
     foreach (var company in companies) 
     { 
      ret.Add(company.ConvertToDataTransferObject()); 
     } 
     return (T)Convert.ChangeType(ret, typeof(T)); 
    } 
+0

:それはあなたのために十分である場合http://stackoverflow.com/questions/42902164/how-to-map-expressionfunctentity-bool-to-expressionfunctdbentity-bool/42904029#42904029は見てみましょう – xanatos

答えて

1

[OK]を少し変更しました。

ファーストロジックは:

  1. サービス層のみがDTOパラメータを受け取り、唯一のDTOオブジェクトを返します。
  2. リポジトリ層はDTOパラメータのみを使用し、述語パラメータはDTOのみであり、DTOオブジェクトのみを返します。

は今です:

  1. サービス層のみがDTOパラメータを受け取り、唯一のDTOオブジェクトを返します。
  2. リポジトリ層はDTOパラメタのみを取り、述語パラメータはDALのみでDTOオブジェクトのみを返します。この質問がありました