麻烦林克到 SQL 查询

本文关键字:查询 SQL 林克 麻烦 | 更新日期: 2023-09-27 18:32:34

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

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);
        }

此搜索查询将允许我找到城市中fromto日期之间的所有可用汽车。因此,为此,我必须检查用户选择的日期是否不在不可用表中。
例如这辆车不可用

从 01/

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

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

但是有些地方不对劲,它永远不会显示任何结果。谁能帮我修复它?

麻烦林克到 SQL 查询

我要在这里在黑暗中拍摄:Df的意思是"约会鳍",Dd的意思是"约会首次亮相"吗? 如果是这样,则您的查询将查找日期范围结束之后开始之前的内容。

你可能想要这样的东西:

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

更新

如果只想包含给定范围之外的日期,则需要日期早于开始日期或晚于结束日期:

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

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。

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

以这种方式 Sloved :

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();

谢谢大家的帮助。