簡體   English   中英

LINQ中使用DateTime的sql查詢中的“ where”子句?

[英]“Where” clause in linq to sql query using DateTime?

我正在嘗試使用c#中的Domain,LastUsed和FreqInHours列運行表查詢。

我只想返回我需要爬網的所有域。我通過檢查它們上次爬網的日期時間(LastUsed)以及應爬網的頻率(例如每6小時一次)來發現這一點。 如果當前日期/時間-上次爬網的時間大於我添加的要返回該域的頻率。

這是我編寫的當前查詢:

var query = (from c in context.SitemapFreqs
             where (DateTime.Now - c.LastUsed).TotalHours > c.Freq
             select c.domain);

這是我得到的例外:

LINQ to Entities無法識別方法'System.DateTime? ToDateTime(System.Object)'方法,並且該方法不能轉換為商店表達式。

任何幫助將非常感激。

您可以使用DbFunctions類和方法DiffHours

這是一個例子:

var query = (from c in context.SitemapFreqs
             where DbFunctions.DiffHours(DateTime.Now,c.LastUsed) > c.Freq
             select c.domain);

這是文檔 希望能幫助到你。

Linq2SQL需要處理復雜的DateTime內容。

如果數據量相對較小,請先將其全部加載到內存中:

var query = (from c in context.SitemapFreqs.ToList()
             where (DateTime.Now - c.LastUsed).TotalHours > c.Freq
             select c.domain);

如果數據量較大,則可以使用DbFunctions或自己提供查詢。

context.SitemapFreqs.SqlQuery("SELECT * from SitemapFreqs WHERE DATEDIFF('hour', GETDATE(), LastUsed) > Freq")

如果您確保查詢返回SitemapFreqs對象期望的列,則它將映射對象,就像處理其他任何事情一樣。

看起來您的c.LastUsed屬性是可為空的。 您可以使用c.LastUsed.Value屬性減去可為空的DateTime,但是您應該知道,如果它為null,則將拋出異常,因為您無法減去DateTime- null 我相信您有兩種選擇:

  1. 通過刪除?,將類中的LastUsed屬性更改為不可空的DateTime。
  2. 在您的類中創建一個確定DateTime? LastUsed可用的方法DateTime? LastUsed DateTime? LastUsed等於null。 如果是這樣,則返回一些您的LINQ查詢將忽略該值的值。 (即:設置LastUsed = DateTime.Now的值,以便您的LINQ查詢返回為0)。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM