【问题标题】:join a table with itself与自身连接一个表
【发布时间】:2015-12-25 13:05:53
【问题描述】:

目的:

在“Reservations”表中,一行表示已预订的资源。 行可以共享一个“预订 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

【问题讨论】:

  • 你能先试一试,然后我们在需要的地方提供帮助吗?
  • 我已经拍摄了 30 分钟。我对 lamdba 不太擅长,我一直在谷歌上搜索所有类似的东西“加入同一张桌子”“自引用表格”我可以似乎找不到我要找的东西。
  • 加入同一个表与加入两个不同的表没有什么不同。只需使用两次context.MyTable,而不是使用context.Table1context.Table2

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


【解决方案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);

【讨论】:

  • x 表示第一个表中的行,y 表示第二个表中的行。 (x,y)=&gt;y 是从第二个表中选择行的选择器。
  • 但是你把同样的东西写了两次。 x => x.ReservationId, x => x.ReservationId
  • 两者都在指定加入条件。第一个将ReservationId 定义为第一个表的列,第二个定义第二个表的列。
  • 标记这是我的答案。其他答案也可能是正确的,但我在我的表达中使用了替代版本,这很有效。
【解决方案2】:

类:

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 过滤值whereExternBoolean 属性为真(对于集合中的每个r,检查r.ExternBoolean)和join 每个过滤对象到同一集合的所有元素reservations(第一个参数) 通过匹配属性的相等性。

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

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

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

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

【讨论】:

  • r, r1 和 r2 是 lambda 表达式的一部分。我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多