2011-02-19 9 views
2

構造的には同じですが、命名規則は異なります。例:Products1、Products2、Products3(これは従来のdbスキーマの一部です。私はこれについて多くをすることはできません)。名前でエンティティオブジェクトを取得する - LINQ to Entities、EF 4.0

これらのクラスはCLRに関するものですが、残念なことにデザインコードが自動生成されているため、共通性を示すためにこれらのユーザーのインターフェイスを叩くことはできません。だから、私の質問です:名前でエンティティオブジェクトを取得する方法はありますか?

これらのオブジェクトに本質的に同じロジックを適用する場合は、スイッチ/ケースビジネスを避けるのが基本です。

答えて

0

私たちが話しているクラスの数、柔軟性が必要な方法によっては、インタフェースが問題にならないかもしれません。私は、ジェネリックを使用して似たようなやった:

//WARNING: Partially-remembered code ahead... 
interface IDuckEntity 
{ 
    int FeatherCount { get; set; } 
} 

public partial class Products1 : IDuckEntity { } 
public partial class Products2 : IDuckEntity { } 
public partial class Products3 : IDuckEntity { } 

//in some other class: 
void DoStuff<T>(T entity) where T : EntityObject, IDuckEntity 
{ 
    entity.FeatherCount = 500; 
} 

だから基本的に、あなたはインターフェイスとそれらのほとんどの部分クラス宣言の束を入れて別のファイルを設定します。次に、共通構造にアクセスできます。あなたの正確な状況はわかりませんが、これは私の魅力のように働いていました。

1

EF4クラスは部分クラスであるため、実際にそれらを拡張し、選択したインターフェイスを別のファイルに実装することができます。

代わりにdynamicを使用しています - そのタイプに基づいてエンティティをインスタンス化するだけです。

dynamic myEntity= Activator.CreateInstance(Type.GetType("EntityTypeHere"))); 
myEntity.CommonProperty = "Foo"; 

ここで大きな欠点は、コンパイル時にすべての型の安全性を失うということです - あなたは、実行時にのみ発見するいかなる問題も、それは静的型付けのアプローチよりも遅くなります。

2

あなたは問題のオブジェクトまたはオブジェクトを照会するには、式ツリーを構築できます。

public T GetSingleObject<T>(int someValue) { 
    MyEntities db = new MyEntities(); 
    var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s")); 

    var param = Expression.Parameter(typeof(T)); 

    var lambda = Expression.Lambda<Func<T, bool>>(
     Expression.Equal(
      Expression.Property(param, "WhateverPropertyYourComparing"), 
      Expression.Constant(someValue)), 
     param); 

    return result.SingleOrDefault(lambda); 
} 

またはご希望のクエリが非常にある場合は、もちろん

public IEnumerable<T> GetResultCollection<T>(int someValue) { 
    MyEntities db = new MyEntities(); 
    var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s")); 

    var param = Expression.Parameter(typeof(T)); 

    var lambda = Expression.Lambda<Func<T, bool>>(
     Expression.Equal(
      Expression.Property(param, "WhateverPropertyYourComparing"), 
      Expression.Constant(someValue)), 
     param); 

    return result.Where(lambda); 
} 

オブジェクトのコレクションをしたい場合これは手を抜くことができ、Justin Morganが提案したように、部分クラスを使用して必要なインタフェースを追加することを検討する必要があります。

このメソッドは、ObjectSetコレクションがオブジェクトと同じ名前であり、 "Invoice"から "Invoice"への "s"を加えたものであることを前提としています。それが「Person」から「People」ではない場合は、System.Data.Entity.Design.PluralizationServices.PluralizationServiceを使用して適切な名前を取得することができます。

関連する問題