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

时间:2015-02-17 13:55:33

标签: c# linq entity-framework c#-4.0 linq-to-sql

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

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

给定一个特定的TourCategoryId和一个日期(dte),我正在尝试构建一个对象,然后我可以继续使用。填充视图模型。

但是我不明白如何根据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));

(也是伪代码)

            .Where(v => v.Booking.NumberBooked.Sum() < v.Tours.PlacesAvailable)

我已经使用下面的建议对此进行了更新,但它返回了所有td.Date - 而不是过滤,如下面的屏幕截图所示,显示了返回的所有3条记录,而不仅仅是{{1 }}:

是的.Any可能不正确吗?

最终结果应为

Tours列表=&gt;日期列表=&gt;预订列表 - 将日期过滤到td.Date == dte,例如:

dte

再次感谢,马克

Screenshot from VS

Tour1- night tours
--TourDate - filtered to 02/03/2015
----Booking1
----Booking2
----Booking3
Tour2- day tours
--TourDate - filtered to 02/03/2015
----Booking1
----Booking2
Tour3- multi-day tours
--TourDate - filtered to 02/03/2015
----Booking1
----Booking2
----Booking3
----Booking4

2 个答案:

答案 0 :(得分:1)

根据我的理解,您希望Tour TourCategoryId TourDate dte 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() }

{{1}}

答案 1 :(得分:0)

您遇到的问题是您使用的业务对象不适合您使用的类层次结构。

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

您应该围绕预订来构建查询,而不是游览。选择符合您条件的预订,包括伪代码中的预订,然后按日期和旅行分组,并选择某种无形对象,代表群组。然后翻译它们以查看所需的模型类,而不是所有这些都是数据库映射的。

在许多情况下,你甚至不需要为了获得某些属性而对实体进行水合作用。

为了能够拍照,无需加载大象。 Include实际上只是一种解决方法,比如杀死大象和按部件装载。