2010-03-11 2 views
3

J'utilise LINQ to SQL pour accélérer la livraison d'un projet, ce qui aide vraiment. Cependant, je me bats avec quelques choses que je suis habitué à faire avec SQL manuel.LINQ: Nombre de réels booléens dans plusieurs colonnes

J'ai une collection LINQ contenant trois colonnes, chacune contenant une valeur booléenne indiquant si un e-mail, un mobile ou une adresse est disponible.

Je veux écrire une requête LINQ pour me donner un nombre de trues pour chaque colonne, alors le nombre de lignes dans la colonne e-mail sont à true (et la même chose pour les deux autres colonnes)

Répondre

2

Si vous avez besoin d'un seul objet contenant les résultats:

var result = new { 
    HasEmailCount = list.Count(x => x.HasEmail), 
    HasMobileCount = list.Count(x => x.HasMobile), 
    HasAddressCount = list.Count(x => x.HasAddress) 
}; 

ou en utilisant la fonction d'agrégation:

class Result 
{ 
public int HasEmail; 
public int HasAddress; 
public int HasMobile; 
} 

var x = data.Aggregate(
new Result(), 
(res, next) => { 
    res.HasEmail += (next.HasEmail ? 0 : 1); 
    res.HasAddress += (next.HasAddress ? 0 : 1); 
    res.HasMobile += (next.HasMobile ? 0 : 1); 
    return res; 
} 
); 

x est de type Result et contient les informations agrégées. Cela peut également être utilisé pour plus d'agrégations compelx.

+0

Deux points - 1) Je ne crois pas que vous pouvez modifier le premier paramètre de la fonction Aggregate, il est en lecture seule. 2) Vous avez inversé vos '0' et' 1', vous ajoutez 1 sur false et 0 sur true. Autre que cela une très bonne idée, mais avoir à faire un «nouveau» sur chaque élément semble «pas idéal» pour moi. – Hogan

1
var mobileCount = myTable.Count(user => user.MobileAvailable); 

Et ainsi de suite pour les autres comptes.

1

Vous pouvez le faire comme ceci:

var emailCount = yourDataContext.YourTable.Count(r => r.HasEmail); 

etc.

Questions connexes