Objectif:

Dans le tableau «Réservations», une ligne représente une ressource réservée. les lignes peuvent partager un «ID de réservation». Donc, si vous avez réservé de la nourriture et une chambre, ce serait deux lignes partageant le même ID de réservation.

Maintenant en utilisant des expressions lambda. si l'une de ces lignes a un ensemble booléen spécial 'appelons-la externBoolean' si c'est vrai. Je veux obtenir cette ligne et les autres lignes qui ont le même ID de réservation. Ensuite, retournez une liste avec toutes les lignes qui ont true dans ce booléen et toutes les lignes sœurs.

En gros quelque chose comme ça:

select t2.*
from Reservations t1
join Reservations t2
on t1.ReservationId = t2.ReservationId
where t1.externBoolean = 1

Faites de la liste des titres une variable membre de votre classe afin que vous puissiez l'obtenir en dehors de votre fil d'arrière-plan, puis déplacez-la:

Réponse: Avec l'aide des suggestions ci-dessous, je me suis retrouvé avec ceci

Il contient un peu plus que la question, mais ça marche

var model1 = db.Pronestor_Internservice.Where(x => DbFunctions.TruncateTime
(x.booking_start_time) >= startDate && DbFunctions.TruncateTime
(x.booking_end_time) <= endDate && x.reservation_name.Contains(search_text) 
&& x.resource_category_id == 61)
.Join(db.Pronestor_Internservice, x => x.reservation_id, x => 
x.reservation_id, (x, y) => y).ToList
0
NoobCoder 25 déc. 2015 à 16:05

2 réponses

Meilleure réponse

Vous pouvez utiliser Queryable.Join

var query = t1.Join(t2, x => x.ReservationId, x => x.ReservationId, (x, y) => new {First = x, Second = y})
    .Where(x => x.First.externBoolean == 1)
    .Select(x => x.Second);

Ou

var query = t1.Where(x => x.externBoolean == 1)
     .Join(t2, x => x.ReservationId, x => x.ReservationId, (x, y) => y);
1
Hamid Pourjam 25 déc. 2015 à 13:20

Pour la classe:

public class Reservation
{
    public int ReservationId { get; set; }
    public bool ExternBoolean { get; set; }
}

Vous pouvez utiliser ce code:

List<Reservation> result = reservations
    .Where(r => r.ExternBoolean)
    .Join(reservations, r1 => r1.ReservationId, r2 => r2.ReservationId, (r1, r2) => new { r1, r2 })
    .Select(pair => pair.r2)
    .ToList();

R, r1 et r2 font partie des expressions lambda.

Vous pouvez lire cette requête d'un appel à l'autre. À partir de la collection source reservations valeurs de filtre { La propriété {X1}} est vraie (pour chaque r dans le contrôle de la collection r.ExternBoolean) et joindre chaque objet filtré à tous les éléments de la même collection reservations (1er paramètre) en faisant correspondre l'égalité des propriétés.

Pour chaque élément r1 de la première collection (filtré), obtenez la propriété ReservationId (2ème paramètre) et pour chaque élément r2 de la seconde collection reservations, obtenez également la propriété ReservationId (3ème paramètre).

Ensuite, pour les paires dans deux collections où les propriétés correspondent, sélectionnez une nouvelle classe anonyme avec 2 champs r1 et r2.

Sélectionnez ensuite dans cette collection de paires pour chaque élément pair uniquement la deuxième propriété r2 (car r2 contient un élément r1 qui se joint à lui-même).

Enfin, exécutez la requête en l'itérant via ToList().

0
Vadim Martynov 25 déc. 2015 à 13:52