2011-03-10 77 views
-3

這裏我的目的是選擇 「開始」(begin_prefix)和 「結束」(end_prefix)間/ TIMERANGE LINQ

但之間的所有條目(登記)!重要的是:

如果我在07:25-10:00的預訂 - 你查詢09:00-10:00它應該仍然顯示預訂,因爲它保留10的房間無論如何什麼..

所以..

07.25-10.00預訂意味着查詢09:00-10.00仍然返回09內預約的列表:00-10.00 (這意味着07.25-10.00包括)

 public static List<booking> Today(DateTime begin, DateTime end) 
     { 
     try 
     { 
      IFormatProvider Culturez = new CultureInfo(ConfigurationManager.AppSettings["locale"].ToString(), true); 
      DateTime begin_prefix = DateTime.ParseExact(begin.ToString(), "dd-MM-yyyy HH:mm:ss", Culturez); 
      DateTime end_prefix = DateTime.ParseExact(end.ToString(), "dd-MM-yyyy HH:mm:ss", Culturez); 

      dbDataContext db = new dbDataContext(); 

      // gives bookings BEFORE begin_prefix (why?) 
      IQueryable<booking> bQ = from b in db.bookings 
       where begin_prefix >= b.Starts && 
       b.Ends <= end_prefix && 
       b.Ends > b.Starts && 
       b.pointsbookings.Count > 0 
       select b; 
      // ^gives bookings BEFORE begin_prefix (why?) 

      List<booking> bL = bQ.ToList(); 

      return bL; 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

我試圖獲得這種權利有一段時間了..好像每次我將其校正成新的東西,外側的兩個新的重疊或選擇開始/結束日期似乎出現:(

更新條件和消息來源:預訂必須在「begin_prefix」和「end_prefix」中,或在同一時間。

..目前上面的代碼給我預訂之前,begin_prefix日期,這是不是有意!我們在2011年,我從2010年開始預訂! **

NEW !!更新:

這是我有:

SEARCH.START> = BOOKING.START

BOOKING.END < = SEARCH.END

...問題出現時。 。

BOOKING條目:10:00(開始)-14:00(完)

這意味着根據以上: 08.59> = 10.00 (SEARCH.START> = BOOKING.START)

它永遠不會包含它。但它應該,因爲這是相同的房間和座位是單獨預訂!

+0

告訴我們您的具體標準是什麼。 「開始」和「結束」都需要在「begin_prefix」和「end_prefix」之內,或者是什麼? – LukeH 2011-03-10 14:07:49

+0

是在或在確切的時間。 – dezza 2011-03-10 14:28:48

+0

很多人會努力幫助你。刪除這個問題會導致他們失去代表。如果您的問題已通過其他方式解決,請在解決方案中留下答案,並在選項可用時將其選中。幫助有類似問題的人,不會懲罰那些試圖幫助的人。 – Will 2011-03-11 14:30:08

回答

1

恕我直言,它應該是這樣的:

from b in db.bookings 
where begin_prefix <= b.Starts && b.Starts < end_prefix && b.Ends <= end_prefix && bEnds >= b.Starts && b.pointsbookings.Count > 0 
select b; 

重要的變化是begin_prefix <= b.Starts而不是begin_prefix >= b.Starts。我還添加了一張支票bEnds >= b.Starts,只是爲了確保。

順便說一句:你標記爲的部分重要似乎對我來說是完全廢話。

+0

同樣的想法在這裏,1爲你 – Pleun 2011-03-10 14:08:58

+0

更新的來源+一些標準的信息,目前給我2011年之前的預訂,這不是故意的! – dezza 2011-03-10 14:35:32

+0

@dezza:只需在我的答案中實施修復!或者爲自己想一點:您要求您的數據庫返回開始日期不超過'begin_prefix'的預訂。所以如果'begin_prefix'是2011年1月1日,它只會返回2010年和更早的預訂。 – 2011-03-10 14:37:48

0

不應該你的begin_prefix < = b.starts和> end_prefix?

+0

更新的來源+一些標準信息,目前給我2011年之前的預訂,這不是故意的! – dezza 2011-03-10 14:34:46

+0

如果我在07:25-10:00預訂 - 您查詢的是09:00-10:00,它仍然應該顯示預訂,因爲它保留了10個房間的房間。 – dezza 2011-03-11 07:23:34

0

這樣,您將選擇範圍正確的預訂:

IQueryable<booking> bQ = from b in db.bookings 
         where b.Starts >= begin_prefix && b.Ends <= end_prefix 
         where b.pointsbookings.Any() 
         select b; 
+0

更新後的來源+一些條件信息,目前在2011年之前給我預訂,這不是故意的! – dezza 2011-03-10 14:37:05

0

這裏:

IQueryable<booking> bQ = from b in db.bookings 
         where b.Starts >= begin_prefix && 
           b.Ends <= end_prefix && 
           b.Starts < b.Ends 
           b.pointsbookings.Count > 0 
         select b; 

你想要的開始時間是開始前綴(b.Starts >= begin_prefix),結束後時間在結束前綴(b.Ends <= end_prefix)之前,並且在結束之後來到(b.Starts > b.Ends)。這就是這段代碼現在所說的。你基本上已經扭轉了不平等。

+0

更新了源+某些標準信息,目前在2011年之前給我預訂,這不是故意的! – dezza 2011-03-10 14:39:22

0

不是100%確定這些代表什麼,但我想知道爲什麼begin_prefix >= b.Starts;它不應該是相反的嗎?

+0

更新的來源+一些標準信息,目前給我2011年之前的預訂,這不是故意的! – dezza 2011-03-10 14:38:02

+0

「// ^給出預訂之前begin_prefix(爲什麼?)」 - 因爲那是你的條件! 'begin_prefix> = b.Starts',即'b.Starts <= begin_prefix'。這是我(和其他人)在我們的答案中指出的。 – 2011-03-10 14:50:16

+0

我已經理解了。 – dezza 2011-03-11 07:28:13

0

我把這個問題的意思是,「從日期時間範圍列表中,我怎麼能找到所有與給定的日期時間範圍重疊?」

如果這是真的,你問什麼,那麼你正在尋找的查詢

//b overlaps the datetime-range [begin_prefix, end_prefix] 
begin_prefix <= b.Ends && end_prefix >= b.Starts