2010-09-06 11 views
3

J'ai deux contrôle RepeaterComment mettre deux conditions dans l'expression lambda

var list = from i in DA.obm_view_studentLists where i.FranchiseID == FranchiseID && i.ExamDate == DateTime.Parse(this.pallavi.DropDownSelectedValue) select i; 

Je veux obtenir le résultat en 1 Go de base de données.

this._approvedStudentList.DataSource = list.Select(e => e.ApprovedByOBM == true); 

this._pendingStudentList.DataSource = list.Select(e => e.ApprovedByOBM == false); 

J'ai une étiquette terrain (UnPaidTotal) dans pendingStudentList Répéteur où je veux afficher Total des frais en attente

J'ai essayé mais ne

UnPaidTotal = string.Format("{0:c}", list.Select(e => e.ApprovedByOBM == true).Sum(j => j.CourseFee)); 
+0

Quel est le message d'erreur que vous obtenez? –

+0

Je pense que vous voulez un .Where() pas un .Select() Alors vous pouvez juste && les conditions ensemble .Where (p => p.x == a && p.y == b) – Robaticus

Répondre

2

Évaluer list pour obtenir tous les résultats en un tir - juste envelopper from i in… select i entre parenthèses et ajouter .ToList() à la fin.

Lors du réglage du DataSource, remplacez list.Select(… avec list.Where(…

Même chose lors de l'obtention du total impayé - utiliser Where au lieu de Select. Vous n'avez pas besoin de renvoyer deux collections de la base de données, car vous divisez les résultats en fonction d'une valeur booléenne. Vous voulez tous des résultats de la requête, car peu importe ce que chaque résultat appartiendra à une collection ou l'autre, vous pouvez donc les fractionner en mémoire.

Select est utilisé pour effectuer une transformation sur une collection, alors que Where est un filtre. Un exemple de select serait manufacturerList = carCollection.Select(car => car.Manufacturer);. Cela prend une collection de voitures, et le transforme en un nombre de fabricants, en sélectionnant juste cette propriété de chaque membre de la collection.

1

La clé ici est qu'après votre première ligne de code où vous créez la requête pour la variable de liste, vous n'êtes pas encore sorti de la base de données. Tout ce que vous avez fait est de créer un IEnumerable/IQueryable qui sait comment aller à la base de données et obtenir vos données. Il ne se passe rien tant que vous ne le liez pas à un contrôle ou que vous n'essayez pas d'itérer sur les résultats. Votre problème est que lorsque vous liez finalement au premier contrôle, l'état de ce IEnumerable change de sorte qu'il pointe maintenant vers la fin du jeu de résultats plutôt que d'attendre l'ouverture de la base de données au début. Lorsque vous essayez de lier le deuxième répéteur, il n'y a aucun enregistrement. La manière la plus simple d'y remédier est de simplement placer les résultats de la requête d'origine dans une liste, mais sachez que cela entraînera le chargement par votre serveur Web de l'intégralité du jeu de résultats dans la RAM. Une autre option consiste à utiliser un répéteur, à ordonner la requête de manière appropriée et à utiliser le code pour afficher le code html souhaité en fonction du type de ligne que vous avez et du code html supplémentaire entre les sections. Cela fonctionnera mieux mais croise des lignes entre des niveaux distincts.