2015-11-18 13 views
8

C'è un modo di scrivere una query LINQ di provocare:selezionare il conteggio (Id) in LINQ

select Count(Id) from tbl1 

perché

tbl1.Select(q=>q.Id).Count() 

non si traduce per il risultato che voglio

aggiornamento:

restituisce:

select count(*) from tbl1 

Aggiornamento dopo la risposta:

ho provato lo scenario con più di 21.000.000

execution plan

record counts

+1

Ha restituire un risultato diverso? – Shaharyar

+0

Utilizzare 'Where' invece di' Select' – Shaharyar

+9

Forse 'tbl1.Count (x => x.Id! = Null)' – haim770

risposta

3

non v'è alcun modo per scrivere una query LINQ di provocare

No. La prima cosa è. per capire di cosa hai bisogno, per esempio, in T-SQL, puoi usare:

  • COUNT(*) conteggia le righe nella tabella
  • COUNT(column) conteggia le voci in una colonna, ignorando i valori nulli.

Se avete bisogno di contare il numero di righe che hai, basta usare

var total = tbl1.Count(); 

Se avete bisogno di vedere quante entità si ha dove una colonna specifica non è nullo, quindi utilizzare un filtro sovraccarichi di Metodo Count.

var total = tbl1.Count(x => x.Id != null); 

No, non è possibile. Non vi è alcuna differenza con le prestazioni utilizzando Count(*) o'Count (Id) , even more if your Id` è la chiave primaria.

Ho fatto un esperimento con un tavolo qui con più di un milione di tuple. Vedi il piano di esecuzione di entrambe le query. Il primo è il select count(*) e il secondo è select count(id).Il id è la chiave primaria (scusate i risultati sono in portoghese-brasile):

enter image description here

+0

Quindi, conosco la differenza ma volevo vedere se c'è un modo per avere quella query o no. sembra che non sia possibile –

+0

No, non è possibile. Non vi è alcuna differenza con le performance usando 'Count (*)' o'Count (Id) ', principalmente se il tuo' Id' è la chiave primaria. –

+0

e la situazione in cui Id non è la chiave primaria. Esiste una prestazione usando Count (*) o Count (Id)? –

5

Utilizzando count(field) della conta sql tutti i valori non nulli. In LINQ, si può dire:

tbl1.Where(q => q.Id != null).Count(); 

o semplicemente:

tbl1.Count(q => q.Id != null); 
+0

nessun risultato è selezionare il conteggio (*) da tbl1 –

+0

@unosbaghaii Ah penso che sia stato un po 'oscuro con la tua definizione . non vuoi contare e avere un problema con i valori nulli ma vuoi semplicemente contare il numero di ID diversi – Thomas

+2

@unosbaghaii Dovresti fornire dati di esempio e risposta prevista. È davvero necessario nelle domande relative al database. – Shaharyar

0

la possibilità di ottenere

selezionare Count (Id) da tbl1

sarebbe be

tbl1.Where(q => q.Id != null).Select(x => x.Id).Distinct().Count(); 

Il precedente Where è lì per evitare i valori null. Se si desidera che vengano conteggiati, è necessario eliminare lo Where e il Select adattato per gestire le voci null.

Inoltre, se non si desidera contare solo valori distinti, è possibile ignorare le parti Select e Distinct.

1

Per eseguire la stessa funzione di SQL Count(Id) è possibile utilizzare LINQ GroupBy, quindi valutare ciascun gruppo. Ecco un breve, piena frammento:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace CrashTest 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      List<MyObj> objs = new List<MyObj> 
      { 
       new MyObj{Id = 1, MyType = "toto"}, 
       new MyObj{Id = 1, MyType = "tata"}, 
       new MyObj{Id = 1, MyType = "tutu"}, 
       new MyObj{Id = 1, MyType = "titi"}, 
       new MyObj{Id = 2, MyType = "toto"}, 
       new MyObj{Id = 2, MyType = "tata"}, 
      }; 
      var g = objs.GroupBy(i => i.Id); 
      foreach (var group in g) 
      { 
       Console.Out.WriteLine("There is " + group.Count() + " objs of ID:" + group.Key); 
      } 
      Console.Out.WriteLine("There is " + g.Count() + " different ids"); 
     } 
    } 

    public class MyObj 
    { 
     public int Id { get; set; } 
     public string MyType { get; set; } 
    } 
} 

che sarà in uscita:

There is 4 objs of ID:1 
There is 2 objs of ID:2 
There is 2 different ids