C# Linq查询嵌套3个表并选择某些记录

C# Linq查询嵌套3个表并选择某些记录,c#,linq,entity-framework,c#-4.0,linq-to-sql,C#,Linq,Entity Framework,C# 4.0,Linq To Sql,我正在构建一个简单的旅游预订应用程序 它有3个链接表,设置如下 给定一个特定的TourCategoryId和一个日期(dte),我试图构建一个对象,然后用它填充viewmodel 但是,我不明白如何对照dte检查TourDate字段 我是不是想在一句话里做得太多了?有人能帮我解答一下我认为是一个简单的问题吗 谢谢你的建议: 我的linq是: var tours = db.Tours .Include(x => x.TourDate) .Inc

我正在构建一个简单的旅游预订应用程序

它有3个链接表,设置如下

给定一个特定的TourCategoryId和一个日期(dte),我试图构建一个对象,然后用它填充viewmodel

但是,我不明白如何对照dte检查TourDate字段

我是不是想在一句话里做得太多了?有人能帮我解答一下我认为是一个简单的问题吗

谢谢你的建议:

我的linq是:

var tours = db.Tours
            .Include(x => x.TourDate)
            .Include(x => x.TourDate.Select(b => b.Booking))
            .Where(t => t.TourCategoryId == id &&
                        t.TourDate.Any(td => td.Date==dte));
(也是伪代码)

再次感谢你,马克

public class Tour
{
    public int TourId { get; set; }
    public int TourCategoryId { get; set; }
    public string TourName { get; set; }
    public int PlacesAvailable { get; set; }
    public virtual ICollection<TourDate> TourDate { get; set; }
}

public class TourDate
{
    public int TourDateId { get; set; }
    public int TourId { get; set; }
    public DateTime Date { get; set; }
    public virtual Tour Tour { get; set; }
    public virtual ICollection<Booking> Booking { get; set; }
}

public class Booking
{
    public int BookingId { get; set; }
    public int TourDateId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int NumberBooked { get; set; }
    public virtual TourDate TourDate { get; set; }
}

公共课旅游
{
公共int-TourId{get;set;}
公共int TourCategoryId{get;set;}
公共字符串名称{get;set;}
public int placesavaailable{get;set;}
公共虚拟ICollection TourDate{get;set;}
}
公务舱巡游日期
{
public int TourDateId{get;set;}
公共int-TourId{get;set;}
公共日期时间日期{get;set;}
公共虚拟游览{get;set;}
公共虚拟ICollection预订{get;set;}
}
公共课预订
{
public int BookingId{get;set;}
public int TourDateId{get;set;}
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
public int NumberBooked{get;set;}
公共虚拟TourDate TourDate{get;set;}
}

据我所知,您需要
TourCategoryId
中的任何
TourDate
dte

foreach(var tour in tours)
{
    tour.TourDate = tour.TourDate.Where(td => td.Date == dte).ToList()
}
这可能对你有用

var tours =
    db.Tours
        .Include(x => x.TourDate)
        .Include(x => x.TourDate.Select(b => b.Booking))
        .Where(t => t.TourCategoryId == id &&
                    t.TourDate.Any(td => td.Date == dte));
要过滤
TourDate

foreach(var tour in tours)
{
    tour.TourDate = tour.TourDate.Where(td => td.Date == dte).ToList()
}

您面临的问题是,您使用的业务对象不适合您使用的类层次结构

尽量不要严格使用数据库映射类。在本例中,您的业务对象不同于仅与db结构匹配的Tour类实例列表。在您创建的所有导航属性的帮助下,只需使用db类就可以形成一个查询,但不要尝试将您需要的所有查询与视图模型的类层次结构相匹配

您应该围绕预订而不是旅游建立查询。选择符合您的条件的预订,包括伪代码中的预订,然后按日期和行程分组,并选择某种表示组的动画对象。然后将这些转换为所需的视图模型类,而不是所有模型类都是数据库映射的

在许多情况下,您甚至不需要实体来加载某些属性

不需要装载大象就可以拍照。
Include
实际上只是一种变通方法,就像杀死大象和按部件加载一样。

应该是
。Where(t=>t.TourCategoryId==id&&t.TourDate.Any(td=>td.Date==dte))
您希望最终结果输出是什么?嗨-我现在已经添加了所需的输出。谢谢你好-谢谢你的意见。它仍然显示所有3条记录,但我已经更新了上面的截图。你的问题是,你期望的输出是什么。您能澄清一下吗?您好-TourDate表中有3条记录-日期分别为2015年3月1日、2015年3月2日、2015年3月3日-过滤器为t.TourDate.Any(td=>td.Date==dte)-其中dte=2015年3月2日-应该只有1条结果-但是在屏幕截图中,显示的每条记录都有3条。谢谢Romoku-如果我不清楚,很抱歉linq查询返回的是包含日期的
Tour
对象。你想要的是
TourDate
对象而不是
Tour
对象吗?嗨-我想要两个Tours->TourDates->Bookings-我是不是把它弄得太复杂而无法作为一个查询
foreach(var tour in tours)
{
    tour.TourDate = tour.TourDate.Where(td => td.Date == dte).ToList()
}