-1

这是我的数据库(它的一部分):

Vehicule table :
Matv string primary ;
cCode int foreign key references city,
// some other columns
Indisponible(unavailable) table:
idin int primary,
from date 
to date
idv string foreign key references Matv in vehicule table.

一辆车可以有许多不可用的日期。

这是我的搜索方法:

        public ActionResult search(int citycode, string from, string to)
        {
            DateTime dd1 = Convert.ToDateTime(from);
            DateTime df1 = Convert.ToDateTime(to);
            var model = (from p in entity.vehicule
                         join y in entity.indisponible on p.Matv equals y.idv
                         where p.cCode == citycode && ( dd1 > y.Df && df1 < y.Dd )
                         select p).ToList();
            return View(model);
        }

这个搜索查询将允许我找到日期from和之间城市中的所有可用汽车to。所以要做到这一点,我必须检查用户选择的日期是否不在不可用的表中。
例如这辆车不可用

从 01/04/201 到 26/04/2012 和从 01/05/2012 到 09/05/2012。

因此,如果用户从 28/04/2012 到 30/04/2012 进行搜索,则必须显示此车
否则,如果他从 28/04/2012 到 03/05/2012 进行搜索,则此车将不会显示在搜索结果中。

但是出了点问题,它永远不会显示任何结果。任何人都可以帮我解决它吗?

4

3 回答 3

2

我要在这里在黑暗中拍摄:是Df指“Date Fin”还是Dd“Date Debut”?如果是这样,您的查询将查找日期范围结束之后开始之前的项目。

你可能想要这样的东西:

dd1 < y.Df && df1 > y.Dd

更新

如果您只想包含给定范围之外的日期,则需要在开始日期之前结束日期之后的日期:

dd1 > y.Df || df1 < y.Dd
于 2012-04-26T22:56:29.743 回答
1

where适用于每一行。它不能同时考虑多行来确定可用性。但它应该......我们范围内的任何不负责任的记录都应该完全过滤汽车。

这可能更接近您想要的:

from p in entity.vehicule
where p.cCode == citycode
where p.indisponibles.All(y => y.Df < dd1 || df1 < y.Dd)
select p

如果每条记录都满足该条件,则所有返回 true,并且当源为空时返回 true。

如果在我们的范围之后开始或在我们的范围之前结束,那么不负责任的记录不应该过滤我们的汽车。如果所有不负责任的记录都是这样,那么我们保留汽车。

于 2012-04-27T15:47:17.920 回答
1

以这种方式爱抚:

from p in entity.vehicule                        
                         where p.agence.idgov == idv
                         where !p.indisponible.Any(b => (dd1 >= b.Dd && dd1 <= b.Df) || (df1 >= b.Dd && df1 <= b.Df))
                         where !p.indisponible.Any(c => (c.Dd >= dd1 && c.Dd <= df1) || (c.Df >= dd1 && c.Df <= df1))
                         select p).ToList();

感谢你的帮助。

于 2012-04-27T18:42:35.300 回答