LINQクエリまたはGetObjectKeyを使用して単一のEntity Frameworkエンティティを取得します。

asp.net c# entity-framework linq

質問

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();
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ