3

次のようなクエリが複数あります。

var query = from a in EntityAs
            select new EntityASmall()
            {
                // Common Stuff:
                Id = a.Id,
                Name = a.Name,
                ShortName = a.ShortName,
                // Specific to EntityA:
                ASpecificProperty1 = a.1,
                ASpecificProperty2 = a.2
            };

var query = from b in EntityBs
            select new EntityBSmall()
            {
                // Common Stuff:
                Id = b.Id,
                Name = b.Name,
                ShortName = b.ShortName,
                // Specific to EntityB:
                BSpecificProperty1 = b.1,
                BSpecificProperty2 = b.2
            };

IdEntityA と EntityB はどちらも、 、Name、およびShortNameプロパティを持つ共通の基本クラスから派生します。EntityASmallとについても同様EntityBSmallです。私はこのようなクエリをたくさん持っているので、最初に一般的なものを取り除くためのある種の簡略クエリを作成したいと思います。次のような、やや有望な拡張メソッドを見つけました。

public static TSource SetCommonProperties<TSource>(this TSource input, EntityBaseClass entity, Action<TSource> updater) where TSource : EntitySmallBase
{
    input.Id = entity.Id;
    input.Name = entity.Name;
    input.ShortName = entity.Name;

    updater(input);

    return input;
}

次のように使用できます。

var query = from a in EntityAs.AsEnumerable()
            select new EntityASmall().SetCommonProperties(a, x =>
            {
                ASpecificProperty1 = x.1;
                ASpecificProperty2 = x.2;
            });

に注意してくださいAsEnumerable()。それがないと、「ステートメント本体を含むラムダ式を式ツリーに変換できません」というメッセージが表示されます。これは、おおまかに言えば、そのAction部分を LINQ-to-SQL の式に変換しようとしていることを意味します。AsEnumerable()は、完全に機能するコレクションをローカルに持ってくるようです。長々とした投稿で申し訳ありませんが、LINQ-to-SQL と Entity Framework で動作する、これを記述する式のような方法はありますか? 前もって感謝します。

4

2 に答える 2

1

あなたはコードを DRY にしたいと考えています。これは常に何らかの努力を払うのに良いことです。おそらく、あなたのアプローチは多少の苦労と労力といくらかのExpressionブードゥーを使って動作するようになるでしょうが、おそらく次のリンクが好きになるでしょう: AutoMapper の使用をやめてくださいあなたのデータアクセスコード。(AutoMapperを使用していなくても)。

この素晴らしい作業により、次のような簡潔なステートメントを記述できるようになります。

context.EntityAs.Project().To<EntityASmall>();
context.EntityBs.Project().To<EntityBSmall>();

私はこれを自分で使用しましたが、とても気に入っています。

于 2012-06-16T21:17:12.570 に答える
0

あなたが思いついた拡張方法は大丈夫に見えます。

派生エンティティごとに作成する必要があります。派生エンティティがいくつかあるように見えるので、この場合は問題ない可能性があります。

第二に、拡張メソッドでそのアクションデリゲートを渡す必要があるとは思わない。代わりに、可能であればそこでそのメソッドを呼び出すだけです。デザインについてはよくわかりません。

したがって、拡張メソッドは次のようになります

public static TSource SetCommonProperties<TSource>(this TSource input, EntityBaseClass entity)     where TSource : EntitySmallBase 
{ 
   input.Id = entity.Id; 
   input.Name = entity.Name; 
   input.ShortName = entity.Name; 

   this.Update(input); // Or this method could exist in any other class or static class.

  return input; 

}

次に、次のように拡張方法を使用することもできます。

var query = from a in EntityAs
        select new EntityASmall
        {      
            ASpecificProperty1      
            ASpecificProperty2    
        }).SetCommonProperties(a,entity)    

これにより、AsEnumerableを使用する必要がなくなります。必要に応じて、同じメソッドを使用して、ベースメソッドから派生メソッドに変換することもできます。

DerivceEntityObject SetCommonProperties(BaseEntity)

これが私がここで提案しようとしていることのアイデアをあなたに与えることを願っています。

于 2012-06-15T16:12:17.737 に答える