Récupérer des entités Entity Framework uniques à l'aide d'une requête LINQ ou de GetObjectKey?

asp.net c# entity-framework linq

Question

Il semble que GetObjectKey présente l'avantage de rechercher des objets instanciés existants et THEN le magasin de données. Cependant, il semble également que vous perdiez une partie de la frappe forte et que vous deviez lancer l'objet résultant:

GetObjectKey

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

vs LINQ

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

Personnellement, je préfère cette dernière méthode, à cause de la frappe. En outre, votre DAL sera relativement uniforme, toutes les méthodes Get étant des requêtes, bien que ce ne soit qu'une préférence personnelle.

Qu'est-ce que vous utilisez, garçons et filles?

Réponse acceptée

Je préfère ce dernier parce qu'il est clairement clair ce que vous voulez. En utilisant EntityKey (et c'est quelque chose que l'équipe ADO.NET ne semble pas comprendre), nous devons contourner la structure que nous a imposée Entity Framework. En utilisant le langage de requête comme vous l'avez fait dans le deuxième exemple, nous disons à tous les autres développeurs qui consulteront jamais notre code, hé, nous voulons juste cet objet avec cet ID ou nous voulons null.

Je ne pense pas que le fait d'être correct (comme dans le premier exemple également) est une excuse pour ne pas être clair pour vos collègues. :)


Réponse populaire

Dans ma solution, j'utilise la programmation générique. Dans la classe Repository de base, j'ai un code comme celui-ci:

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

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow