2017-05-16 10 views
0

データベースエンティティをpocoオブジェクトにマッピングするために使用するコードを重複させないようにするにはどうすればよいですか?このコードを考えると一般的なlinq式を使用してエンティティの重複を避ける

private IQueryable<DummyExtended> Find() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyExtended 
      {       
       Description = dt.table_1.table_2.description,    
       Dummy = new Dummy 
       { 
        Name = d.name, 
        Notes = d.notes, 
        HelpText = d.help_text   
       } 
      }).AsQueryable(); 

} 

は、私は両方の方法のために再使用される一般的なLINQの式を作成することはできますか?

private IQueryable<DummyExtended> Find() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyExtended 
      {       
       Description = dt.table_1.table_2.description,    
       Dummy = ...??? 
      }).AsQueryable(); 

} 

private IQueryable<DummyAlsoExtended> FindAnother() 
{ 
    return (from dt in Entities.dummy_table 
      select new DummyAlsoExtended 
      {       
       InnerHtml = dt.table_html.description,    
       Dummy = ....?? 
      }).AsQueryable(); 

} 

例:私はかなりそれを取得することはできません右

.... 
Dummy = ExtensionClass.EntityToPoco() 
+0

私はあなたがLINQKitと '.AsExpandable(を検討する必要があると思います) '。 – NetMage

答えて

0

ですから、オブジェクトの列挙または照会可能シーケンスであるdummy_tableを持って

public static Expression<Func<dummy_table, Dummy>> EntityToPoco() 
{ 
    return d => new Dummy 
    { 
     Name = d.name, 
     Notes = d.notes, 
     HelpText = d.help_text 
}; 

}

。シーケンスにクラスDummyTableElementのオブジェクトが含まれているとしましょう。

DummyTableElementがある場合は、Dummyオブジェクトに変換する方法を知っています。この関数を再利用して、DummyExtendedDummyAlsoExtendedのような他のオブジェクトを作成したいとします。あなたはこのLINQ-同様の操作を行いたい場合は、それはそれのための拡張機能を作成するのが最善です:

static class DummyTableElementExtensions 
{ 
    public static Dummy ToDummy(this TableElement tableElement) 
    { 
     return new Dummy() 
     { 
      Name = tableElement.name, 
      Notes = tableElement.notes, 
      HelpText = tableElement.help_text  
     }; 
    } 
} 

あなたがこれをしたら、DummyExtendedDummyAlsoExtendedTableElementsを変換するために、同様の機能を作成することができます。彼らは1ライナーになるでしょう。

同じ拡張クラスで:

public static DummyExtended ToDummyExtended(this TableElement tableElement) 
{ 
    return new DummyExtended() 
    { 
     Description = tableElement.table_1.table_2.description, 
     Dummy = tableElement.ToDummy(),    
    }; 
} 
public static DummyAlsoExtended ToDummyAlsoExtended(this TableElement tableElement) 
{ 
    return new DummyAlsoExtended 
    {       
     InnerHtml = tableElement.table_html.description,    
     Dummy = tableElement.ToDummy(), 
    }; 
} 

そして、あなたはこれらを持ったら、あなたはTableElementsの任意のIQueryableを変換するための拡張機能を作成することができます。

public static IQueryable<DummyExtended> ToDummyExtended(
    this IQueryable<TableElement> tableElements) 
{ 
    return tableElements 
     .Select(tableElement => tableelement.ToDummyExtended(); 
} 

と同様の1行DummyAlsoExtendedの機能あなたのFind機能とFindAnother機能

もワンラ​​イナーになります

private IQueryable<DummyExtended> Find() 
{ 
    return dummy_table.ToDummyExtended(); 
} 

private IQueryable<DummyAlsoExtended> FindAnother() 
{ 
    return dummy_table.ToDummyAlsoExtended(); 
} 

あなたはこの中で表現を使用していた理由は、私はよく分かりません。とDummyAlsoExtendedは、両方ともプロパティDummyを持っている点を除いて、実際には似ていないようです。

Find関数で匿名クラスを作成する必要があるため、find関数の宛先をパラメータ化する理由の1つが原因です。再び

、あなたがToDummyを作成したら、これはワンライナーになります

public static IQueryable<TResult> Find<TSource, TResult>(
    this IQueryable<TSource> source, 
    Expression<Func<TSource, TResult>> resultSelector) 
{ 
    return source.Select(sourceElement => resultSelector(sourceElement); 
} 

使い方は次のようになります。

var X = dummy_Table.find(tableElement => new 
    { 
     foo = tableElement.CalculateFoo(), 
     bar = tableElement.CalculateBar(), 
     Dummy = tableElement.ToDummy(), 
    }); 
+0

カスタム(拡張)メソッドは、LINQ to Entitiesの式ツリー内ではサポートされていません。 –

関連する問題