GetObjectKeyには既存のインスタンス化されたオブジェクトを検索し、次にデータストアを検索するという利点があります。しかし、強い型付けを失い、結果のオブジェクトをキャストする必要があるようです。
GetObjectKey
int customerID = 1;
EntityKey key = new EntityKey("MyEntities.Customers", "CustomerID", customerID);
Customer customer = context.GetObjectByKey(key) as Customer;
対LINQ
int customerID = 1;
Customer customer = (from c in context.Customers
where c.CustomerID = customerID
select c).FirstOrDefault();
個人的には、私は後者の方法を好む、なぜならタイピングのためです。また、あなたのDALはすべてのGetメソッドがクエリであることでかなり一様になりますが、それは個人的な好みです。
男の子と女の子は何を使いますか?
それがあなたが何を望んでいるのか明確にはっきりしているので私は後者を好む。 EntityKeyを使用すること(そしてこれはADO.NETチームが理解していないようなことです)、Entity Frameworkによって課された構造を回避する必要があります。 2番目の例で行ったのと同じ方法でクエリ言語を使用することで、コードを見ることになる開発者全員にこのIDを持つオブジェクトが欲しい、またはnullが欲しいと言っています。
私は(あなたが最初の例でもそうであるように)正しいことはあなたの同僚にはっきりしないことの言い訳だとは思いません。 :)
私のソリューションでは、汎用プログラミングを使用しています。基本のRepositoryクラスでは、私はこのようなコードを持っています:
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();
}