麻烦林克到 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);
}
此搜索查询将允许我找到城市中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 这辆车将不会显示在搜索结果中。
但是有些地方不对劲,它永远不会显示任何结果。谁能帮我修复它?
我要在这里在黑暗中拍摄: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();
谢谢大家的帮助。