Comparing DateTimes in a LINQ to SharePoint Query

September 10 2010 23 comments

Last time I blogged about LINQ to SharePoint (available for SharePoint 2010), and especially about the fact that the underlying CAML generation matters, even though it is hidden by the developer. Here is another issue, or a bug, that I came across.

Consider the following simple situation: you want to fetch and display those calendar events that start within the next three hours. Here’s the code that should do it:

private void ShowUpcomingEvents()
{
    string url = "http://test.sp.dev/test";
    StringWriter logger = new StringWriter();

    var time1 = DateTime.Now;
    var time2 = time1.AddHours(3);

    using (var context = new MyDataContext(url))
    {
        context.Log = logger;
        var items = from e in context.Calendar
                    where e.StartTime != null && e.StartTime > time1
                                              && e.StartTime < time2
                    select e;
               
        Console.WriteLine("Fetched items: {0}", items.Count());
    }

    Console.Write(logger.ToString());
}

Even though I have plenty of events that should match the criteria, the code prints:

Fetched items: 0

The generated CAML (that also gets printed to the console) looks just fine at the first sight:

<View>
  <Query>
    <Where>
      <And>
        <BeginsWith>
          <FieldRef Name="ContentTypeId" />
          <Value Type="ContentTypeId">0x010200</Value>
        </BeginsWith>
        <And>
          <And>
            <IsNotNull>
              <FieldRef Name="EventDate" IncludeTimeValue="TRUE" />
            </IsNotNull>
            <Gt>
              <FieldRef Name="EventDate" IncludeTimeValue="TRUE" />
              <Value Type="DateTime">2010-09-03T10:07:18Z</Value>
            </Gt>
          </And>
          <Lt>
            <FieldRef Name="EventDate" IncludeTimeValue="TRUE" />
            <Value Type="DateTime">2010-09-03T13:07:18Z</Value>
          </Lt>
        </And>
      </And>
    </Where>
  </Query>
  <ViewFields>
  </ViewFields>
  <RowLimit Paged="TRUE">2147483647</RowLimit>
</View>

A closer look reveals that the <Value Type=”DateTime”> element is missing the IncludeTimeValue=”TRUE” attribute. This means that the date comparisons in CAML are made on date level. This is clearly not what I wanted. Not surprisingly, replacing the < and > comparisons with <= and >= comparisons returns plenty of events, but they actually return all events of the current day (or all events of two days if queried just before midnight).

The solution? I have to fetch all events of possible interest (i.e. all events of the current and possibly the next day), and do the time-level filtering with in-memory LINQ. Following the guidelines of my previous post, I refactored the code as follows:

private void ShowUpcomingEvents()
{
    string url = "http://test.sp.dev/test";
    StringWriter logger = new StringWriter();

    var time1 = DateTime.Now;
    var time2 = time1.AddHours(3);

    using (var context = new MyDataContext(url))
    {
        context.Log = logger;

        // This query gets translated to CAML and executed in content database
        // Note that the CAML datetime comparisons are made on a date level!
        var items = (from e in context.Calendar
                    where e.StartTime != null && e.StartTime >= time1 && e.StartTime <= time2
                    select e).ToList(); // ToList() executes the CAML

        // Perform additional filtering with in-memory LINQ
        items = items.Where(e => e.StartTime >= time1 && e.StartTime <= time2).ToList();

        Console.WriteLine("Fetched items: {0}", items.Count());
    }

    Console.Write(logger.ToString());
}

Note that even though the conditions in both LINQ statements look the same, the actual filtering logic is different!

Popularity: 8% [?]

23 comments to “Comparing DateTimes in a LINQ to SharePoint Query”

  1. Chaminda says:

    Any ideas how we can fetch recurring events breakdown to recurring instances ?

  2. chaminda somathilaka says:

    I have a problem here. how can we user LINQ to query a calender list to get all the events including recurring events, all day events etc.
    my experience is that when you use LINQ, the resultant data set only has events that are on the list as collective events. for examples recurring events may have several instances depending upon the frequency they are occurring. Do you have any suggestion on how to use LINQ to query calender with Recurring events expanded ?

  3. Clem says:

    It’s important to note that an asmx web service is used here. Rest web services will not work with this. using statements are not permitted with Rest services if they do not implement IDisposable. Also, the List type cast is invalid.

  4. clear says:

    Everyone loves what you guys tend to be up too. This kind of clever work and coverage!
    Keep up the wonderful works guys I’ve added you guys to blogroll.

  5. asport.pl says:

    You are so interesting! I don’t think I’ve read through a single thing like this
    before. So wonderful to discover another person with a few unique thoughts on
    this subject. Really.. many thanks for starting this up. This site is one
    thing that’s needed on the internet, someone with a little originality!

  6. /andyan56/ says:

    I’m truly enjoying the design and layout of your site.
    It’s a very easy on the eyes which makss itt much more enjoyable for me
    to come here and visit more often. Did you hire out a designer to create your theme?
    Exceptional work!

    my web blog … /andyan56/

  7. Dr. Laurence Fendrich of Lighthouse Point Dental can give you a gorgeous new smile and change your life! Dr. Laurence Fendrich is a graduate of Tufts University.

  8. Excellent post! We are linking to this particularly great content
    on our site. Keep up the good writing.

  9. I think everything said was very reasonable.
    But, what about this? what if you were to write a awesome post title?
    I mean, I don’t want to tell you how to run your website, but suppose you added a title to possibly
    get a person’s attention? I mean Comparing DateTimes in a LINQ to SharePoint
    Query | SharePoint Blues is kinda boring. You ought to glance at Yahoo’s front page and see how they write article titles to grab viewers interested.

    You might add a video or a picture or two to grab readers excited about what you’ve
    written. In my opinion, it would bring your posts a little bit
    more interesting.

  10. Thanks for one’s marvelous posting! I genuinely enjoyed reading it, you are a great author.I will remember to
    bookmark your blog and definitely will come back sometime soon. I want to encourage you to definitely continue your great job,
    have a nice holiday weekend!

  11. Excellent pieces. Keep posting such kind of information on your blog.
    Im really impressed by it.
    Hi there, You’ve done an excellent job. I will certainly digg
    it and personally suggest to my friends. I am confident they’ll be
    benefited from this web site.

  12. Ragiro says:

    Bijvoorbeeld, als je te veel gerechten op een regelmatige basis,
    misschien denk je over het opzetten van een hoge drukspuit mondstuk
    in de gootsteen. Hierdoor kunt u in uw eigen woning in geheel zodat u
    kunt precies bepalen waar je je concentreren uw tijd en moeite.

    Want het is uw eigen, de lasten van het onderhoud van het pand ligt aan uw handen. Het heeft een chique design dat andere mensen alleen wel zouden willen hebben op een tapijt.

    Maar als gevolg van de Tweede Wereldoorlog, vele gedwongen waren te vluchten naar de Verenigde Staten toen de school werd gesloten in 1933.
    Als u de kamer en geniet van de zorg voor kinderen of senioren, begin a
    home gebaseerd bedrijf.

    Niet alleen om het bewijs van tijdige voltooiing maar aandringen dat verzekering van klanttevredenheid.
    Koop alles wat je nodig hebt zelf omdat de professionals zal het voor
    de besteding van de tijd alles verzamelen. Het is het meest gebruikte onderdeel dat híj onthoudt het merendeel van de bezoekers in en buiten het huis.
    Ook andere gebieden zoals open haarden kan ook een bron van attractie.
    ” Zelfs als je financieel, de meeste geldverstrekkers liever uw bedrijf dan uw huis lenen ergens anders heen gaan. Toevoeging van een extra kamer, uitbreiding van de keuken, het plaatsen van een nieuwe vloer, een sportzaal, de uitbreiding van de garage etc kan allemaal via deze leningen.

    Als je een huurder, of indien u het zich niet kunt veroorloven om updates op uw home er zijn op dit moment nog steeds veel mogelijkheden voor het verminderen van uw energieverbruik. Tegenwoordig, led-verlichting met nieuwste technologie is erg populair aan het worden als deze verlichting maakt u de voldoende verlichting in betaalbare prijzen. Er zijn traplift voor rechte, gebogen en wenteltrap. Hoewel het veel werk en kosten, kelder weerbestendigheid is een goede investering, vooral als je het kan pakken het project op uw eigen. Trouw blijven aan de woning en de buurt bij ingrijpende renovaties.

    U kan nog steeds een groene lifestyle in deze situatie door gebruik te maken van zonne-energie ventilatoren en koelers in de strijd tegen de hitte. Binnen een woningverbetering catalogus, bent u gebonden aan alles dat ooit zou kunnen zijn eventueel gebruikt in uw huis of het huis van iemand die u kent. Anders, aftrekbaar zijn op Schema E (verhuur) of EEN (doorverkoop pand). Tropische Nevel Druk zuiveringen waren verbetering homes in South West Palm Beach sinds 2001. Hoewel u misschien geneigd zijn om alle oude werk zo snel als u kunt, zodat je kunt beginnen met het opzetten van nieuw spul, maar je moet wat traag. Accessoires kunnen helpen voeg een persoonlijk tintje toe aan uw interieur.

  13. game says:

    Read the game case in order to discover some information on the game’s storyline.
    Or else consult with the game designer to put any new forms of
    crrative ways for better encouragement to the players.
    This means that you cann shift your entire monthly spending to your credit
    card and earn points, so long as you remmber to payy off your entire balance at the end of every billing cycle.

  14. このサイトなどの兄示唆 I かもしれない。彼かつて 右。このポスト 本当に私の一日行わ。あなたはすることはできません どの 私はこのために費やしていた時間| ただただ 検討信じ! !
    80%off☆限定数量 店内全品ポイント10倍 http://www.politicalramble.com/hot-24617-188.html

  15. 私は詳細を確認したいのですが、あなたは私たちにこのについての詳細を教えてもらえますか? 見つけるために、 私は思います。
    店内全品ポイント10倍 全商品送料無料 http://www.mygoodwill.pl/hot-24394-163.html

  16. おかげ 素敵ブログ!
    2015春夏新色追加 激安特価品割引 http://www.revistamala.cl/hot-24790-210.html

  17. いくつかのいずれか場合はニーズエキスパート·ビュー約 その後私は提案 ウェブサイト この良いです 仕事。
    店内全品ポイント10倍 特価2015 http://moskvasklad.ru/hot-25382-209.html

  18. 兄示唆私はこのウェブサイトのブログを好むかもしれません。右|彼は完全に完全でした。この投稿は、本当に私の一日行わ。あなたはすることができない |私はこののために費やしていたどのくらいの時間単純に想像します!ありがとう!
    人気 50代%本物品質 2015春夏新色追加 http://www.rolfho.com/hot-24792-209.html

  19. 、あなたのための記事のライターの記事の作者あなたが探している場合は私に知らせてください。 投稿と私は|あなたはいくつかの本当に良い素晴らしいを持っている思う私は良い資産になります。バック鉱山へのリンクと引き換えにあなたのブログのためのコンテンツいくつかを書くことがあなたがこれまで負荷オフのいくつかを取りたい場合は、私が本当にのように絶対的に愛すると思います。興味があれば| 電子メールを電子メール してください。 栄誉!
    国内関税込 3日間限定 http://artmoskva.com/hot-24979-209.html

  20. のための願い|このウェブサイト、など私はたい私は に使用されるすべての週末楽しみ、 conations 本当に 良いすぎます。
    超激安通販 2015春夏新色追加 http://www.llynx.nl/?183=24678

  21. ただ あなたの記事のようにあると言う驚くべき。 ポスト | あなたの中にあなたのあなたのための 鮮明明確にするであるだけ クール iと ことができる 考えるこ​​とテーマに|精通し| |この専門家} あなたはプロをしています。 ファイン私はへ {最新の状態に保ちます。 おかげ 百と続​​行下さい楽しい仕事を。
    数量限定 3日間限定 http://ladapodolsk.ru/hot-25093-163.html

  22. Thanks for finally writing about > Comparing DateTimes in a LINQ to SharePoint Query | SharePoint Blues < Liked it!

  23. sicher Website aber müssen Test auf mehrere Ihrer Beiträge. A Nummer Viele von ihnen sind voller Rechtschreib Probleme und zu finden lästigen zu sagen, die Realität wieder Ich Sicherheit wieder einmal.

Leave a Reply