加入一个表自己

时间:2015-12-25 13:05:53

标签: c# .net entity-framework linq lambda

目的:

在表'预订'中,一行代表预订的资源。 行可以共享“预订ID”。因此,如果您预订了一些食物和一个房间,那将是两行共享相同的预订ID。

现在使用lambda表达式。如果这些行中的一个具有特殊的布尔值,则允许将其称为externBoolean(如果这是真的)。我想获取该行以及具有相同预留ID的其他行。 然后返回一个列表,其中包含在此布尔值和所有兄弟行中具有true的所有行。

基本上是这样的:

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

但使用lambda表达式

答案:在下面的建议的帮助下,我最终得到了这个

它包含的内容比问题多一点,但它可以工作

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

2 个答案:

答案 0 :(得分:1)

您可以使用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);

或者

var query = t1.Where(x => x.externBoolean == 1)
     .Join(t2, x => x.ReservationId, x => x.ReservationId, (x, y) => y);

答案 1 :(得分:0)

上课:

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

您可以使用此代码:

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和r2是lambda expressions的一部分。

您可以在通话时阅读此查询。来自源集合reservations过滤器值where ExternBoolean属性为true(对于集合中的每个r检查r.ExternBoolean)和join每个过滤后的对象通过匹配属性的相等性来匹配相同集合reservations(第一个参数)的所有元素。

对于第一个集合(已过滤)的每个元素r1获取ReservationId属性(第二个参数),对于第二个集合r2的每个元素reservations,也获取ReservationId属性(第三个参数)。

然后,对于匹配属性的两个集合中的对,选择具有2个字段r1r2的新匿名类。

接下来从每个元素pair的每个对集合中选择第二个属性r2(因为r2包含与自身连接的元素r1)。

最后通过ToList()迭代执行查询。