-1

これは私のDBです(その一部):

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.

1 台の車両に、利用できない日付が多数ある場合があります。

これは私の検索方法です:

        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。これを行うには、ユーザーが選択した日付が利用できないテーブルにないことを確認する必要があります。
たとえば、この車は利用できません

201/04/01 から 2012/04/26 および 2012/01/05 から 2012/09/05 まで。

したがって、ユーザーが 2012 年 4 月 28 日から 2012 年
4 月 30 日まで検索を行う場合、この車を表示する必要があります。

しかし、何かが間違っています。結果はまったく表示されません。誰かがそれを修正するのを手伝ってくれますか?

4

3 に答える 3

2

私はここで暗闇の中でショットを撮るつもりです: はDf「デート フィン」とDd「デート デビュー」を意味しますか? その場合、クエリは日付範囲の終了後開始前のアイテムを探しています。

おそらく次のようなものが必要です。

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

アップデート

指定した範囲外の日付のみを含める場合は、開始日より前または終了日より後の日付が必要です。

dd1 > y.Df || df1 < y.Dd
于 2012-04-26T22:56:29.743 に答える
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 に答える
1

それwhereは各行に適用されます。可用性を判断するために同時に複数の行を考慮することはできません。しかし、それは... 私たちの範囲内にある無責任な記録は、車を完全にフィルタリングする必要があります。

これはあなたが望むものに近いかもしれません:

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

All は、すべてのレコードがその基準を満たしている場合に true を返し、ソースが空の場合に true を返します。

私たちの範囲の後に開始する場合、または範囲の前に終了する場合、無責任な記録は私たちの車をフィルタリングするべきではありません. すべての無責任な記録がそのようなものである場合、私たちは車を保管します.

于 2012-04-27T15:47:17.920 に答える