[英]“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
。 我相信您有兩種選擇:
DateTime? LastUsed
可用的方法DateTime? LastUsed
DateTime? LastUsed
等於null。 如果是這樣,則返回一些您的LINQ查詢將忽略該值的值。 (即:設置LastUsed = DateTime.Now
的值,以便您的LINQ查詢返回為0)。 希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.