Erhalten Sie nur bestimmte Spalten

entity-framework

Frage

Kann ich meine EF-Objekte dazu bringen, nur bestimmte Spalten in der ausgeführten SQL abzurufen? Wenn ich den folgenden Code zum Abrufen von Objekten ausführen möchte, kann ich dann etwas tun, um nur bestimmte Spalten zu erhalten, wenn gewünscht?

public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp)
{
    return _ctx.CreateQuery<T>(typeof(T).Name).Where<T>(exp);
}

Dadurch würde eine Select-Klausel generiert, die alle Spalten enthält. Aber wenn ich eine Spalte habe, die eine große Datenmenge enthält, die die Abfrage wirklich verlangsamt, wie kann ich dann meine Objekte aus dem generierten SQL-Objekt ausschließen?

Wenn meine Tabelle Id (int), Status (int), Data (Blob) hat, wie kann ich meine Abfrage machen

select Id, Status from TableName

anstatt

select Id, Status, Data from TableName

Nach dem folgenden Vorschlag ist meine Methode

public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp, Expression<Func<T, T>> columns)
{
    return Table.Where<T>(exp).Select<T, T>(columns);
}

Und ich nenne es so

mgr.GetBy(f => f.Id < 10000, n => new {n.Id, n.Status});

Ich bekomme jedoch einen Kompilierungsfehler:

Der Typ "AnonymousType # 1" kann nicht implizit in "Entities.BatchRequest" konvertiert werden.

Akzeptierte Antwort

Sicher. Projektion macht dies:

var q = from r in Context.TableName
        select new 
        {
            Id = r.Id,
            Status = r.Status
        }

Hier ist ein aktuelles Beispiel (offensichtlich hat meine Datenbank andere Tabellen als Ihre). Ich habe mein EF-Modell zu LINQPad hinzugefügt und die folgende Abfrage eingegeben:

from at in AddressTypes
select new
{
    Id = at.Id,
    Code = at.Code
}

LINQPad zeigt mir, dass das generierte SQL Folgendes ist:

SELECT 
    1 AS [C1], 
    [Extent1].[AddressTypeId] AS [AddressTypeId], 
    [Extent1].[Code] AS [Code]
FROM 
    [dbo].[AddressType] AS [Extent1]

Keines der anderen Felder aus der Tabelle ist enthalten.

Beantwortung der aktualisierten Frage

Ihr columns sagt, es braucht einen Typ T und gibt denselben Typ zurück. Daher muss der übergebene Ausdruck dem entsprechen, oder Sie müssen den Typ des Arguments ändern, dh

public IEnumerable<U> GetBy<U>(Expression<Func<T, bool>> exp, Expression<Func<T, U>> columns)
{
    return Table.Where<T>(exp).Select<T, U>(columns);
}

Jetzt kann der Ausdruck jeden beliebigen Typ zurückgeben, den Sie verwenden möchten.



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