次のようなクエリが複数あります。
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
};
Id
EntityA と 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 で動作する、これを記述する式のような方法はありますか? 前もって感謝します。