4 Stimmen

Abfrage einer einzelnen Spalte mit LINQ

Ich möchte Array von Werten einer einzelnen Spalte in einer Tabelle abrufen, zum Beispiel habe ich eine Tabelle mit dem Namen Customer(ID,Name), und möchte ids aller Kunden abrufen. meine Abfrage in LINQ ist:

var ids = db.Customers.Select(c=>c.ID).ToList();

Die Antwort auf diese Abfrage ist richtig, aber ich habe SQL Server Profiler ausgeführt und die Abfrage wie folgt gesehen:

SELECT [t0].[ID], [t0].[Name] FROM [dbo].[Customer] AS [t0]

Ich habe verstanden, dass LINQ alle Spalten auswählt und dann das Integer-Array der ID-Felder erstellt.

Wie kann ich eine LINQ-Abfrage schreiben, die diese Abfrage in SQL Server erzeugt?

SELECT [t0].[ID] FROM [dbo].[Customer] AS [t0]

Ich danke Ihnen.

UPDATE: Ich habe eine Funktion für diese Aufgabe, und diese Funktion führt zu diesem Ergebnis:

public static List<TResult> GetSingleColumn<T, TResult>(Func<T, bool> predicate, Func<T, TResult> select) where T : class
{
    using (var db = new DBModelDataContext())
    {
        var q = db.GetTable<T>().AsQueryable();
        if (predicate != null)
            q = q.Where(predicate).AsQueryable();
        return q.Select(select).ToList();
    }
}

und verwenden Sie es wie folgt:

var ids = DBMH.GetSingleColumn<Customer, int>(null, c => c.ID);

4voto

bkaid Punkte 50360

Wenn Sie nur die Felder auswählen, die Sie benötigen, schränkt dies den Umfang der resultierenden SQL-Abfrage ein. Versuchen Sie dies:

var ids = from customer in db.Customers
          select customer.ID;

2voto

mostafakvd Punkte 86
public static List<TResult> GetSingleColumn<T, TResult>(
   Expression<Func<T, bool>> predicate,
   Expression<Func<T, TResult>> select) where T : class
  {
   using (var db = GetData())
   {
    var q = db.GetTable<T>().AsQueryable();
    if (predicate != null)
     q = q.Where(predicate).AsQueryable();
    var q2 = q.Select(select);
    return q2.ToList();
   }
  }

So sollten Sie vorgehen.

1voto

Amy B Punkte 104656

Repariert!

public static List<TResult> GetSingleColumn<T, TResult>
(
  Expression<Func<T, bool>> predicate,
  Expression<Func<T, TResult>> select) where T : class 
{ 

Da Sie die Func Instanzen anstelle von Expression Instanzen, Sie haben Enumerable.Where y Enumerable.Select anstelle von Queryable.Where y Queryable.Select . Dies führt zu einer lokalen Auflösung anstelle einer datenbankseitigen Auflösung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X