Abrufen einzelner Entity Framework-Entitäten mithilfe einer LINQ-Abfrage oder GetObjectKey

asp.net c# entity-framework linq

Frage

Es sieht so aus, als hätte GetObjectKey den Vorteil der Suche nach vorhandenen, instanziierten Objekten und dann dem Datenspeicher. Es scheint jedoch auch so, als ob Sie etwas von der starken Typisierung verlieren und Ihr resultierendes Objekt umwandeln müssen:

GetObjectKey

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

gegen LINQ

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

Ich persönlich bevorzuge die letztere Methode wegen der Typisierung. Außerdem ist Ihre DAL ziemlich einheitlich, da alle Get-Methoden Abfragen sind. Dies ist jedoch nur eine persönliche Präferenz.

Was benutzt ihr Jungs und Mädels?

Akzeptierte Antwort

Ich bevorzuge letzteres, weil es explizit klar ist, was Sie wollen. Durch die Verwendung von EntityKey (und das scheint das ADO.NET-Team nicht zu verstehen), müssen wir die Struktur umgehen, die uns Entity Framework auferlegt hat. Durch die Verwendung der Abfragesprache in der Art und Weise, wie Sie es im zweiten Beispiel getan haben, sagen wir allen anderen Entwicklern, die sich jemals unseren Code ansehen werden.

Ich denke nicht, dass das Richtige (wie Sie auch im ersten Beispiel sind) eine Entschuldigung ist, Ihren Kollegen nicht klar zu sein. :)


Beliebte Antwort

In meiner Lösung verwende ich generische Programmierung. In der Basis-Repository-Klasse habe ich folgenden Code:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum