2009-06-26 13 views
8

GetObjectKeyは、既存のインスタンス化されたオブジェクトを検索し、その後データストアを検索する利点があります。あなたは強い型付けの一部を失い、あなたの結果のオブジェクトをキャストする必要がありますようにしかし、それはまた、そうです:LINQLINQクエリまたはGetObjectKeyを使用して単一のEntity Frameworkエンティティを取得しますか?

int customerID = 1; 
Customer customer = (from c in context.Customers 
        where c.CustomerID = customerID 
        select c).FirstOrDefault(); 

個人的に、私は後者を好む対

GetObjectKey

int customerID = 1; 
EntityKey key = new EntityKey("MyEntities.Customers", "CustomerID", customerID); 
Customer customer = context.GetObjectByKey(key) as Customer; 

メソッドを使用しています。また、あなたのDALは、ゲットメソッドがすべてクエリーになっていてもかなり均一ですが、これは単なる個人的な好みです。

あなたは男の子と女の子は何を使用しますか?

+0

前者の方法では、キャストの代わりに "as"キーワードを使用します。このようにして結果がnullの場合、例外はスローされません。 asキーワードは値のキャストを試みますが、正しいタイプでない場合はnullを返します。したがって、顧客としてcontext.GetObjectByKey(key)を使用します。 –

+0

良い点。この例を少しでもスコアに変更します。 –

答えて

9

私は後者を好んでいます。これは、あなたが何を望んでいるかを明示的に明確にしているからです。 EntityKey(これはADO.NETチームが理解していないようなものです)を使用することで、Entity Frameworkによって課された構造を回避する必要があります。 2番目の例で行ったようにクエリ言語を使用することで、私たちのコードを見ている残りのすべての開発者に、ちょっとこのIDを持つこのオブジェクトが必要な場合、またはnullを欲しいと言っています。

私は正しいとは言えませんが(最初の例のように)、同僚には分かりません。 :)

1

私のソリューションでは、汎用プログラミングを使用しています。ベースリポジトリクラスでは、次のようなコードがあります。

private string GetEnittySetName(string entityTypeName) 
{ 
    var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
    string entitySetName = (from meta in container.BaseEntitySets 
          where meta.ElementType.Name == entityTypeName 
          select meta.Name).FirstOrDefault(); 
    return entitySetName; 
} 

private string entitySetName; 

protected string EntitySetName 
{ 
    get 
    { 
     if (string.IsNullOrEmpty(entitySetName)) 
     { 
      entitySetName = GetEnittySetName(typeof(T).Name); 
     } 
     return entitySetName; 
    } 
} 

public T SelectOne(Func<T, bool> exp) 
{ 
    return context.CreateQuery<T>(EntitySetName).Where(exp).FirstOrDefault(); 
} 
関連する問題