第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

LINQ where 子句中的 DateTime 屬性錯誤

LINQ where 子句中的 DateTime 屬性錯誤

C#
尚方寶劍之說 2022-12-24 10:25:36
我有一個非常簡單的方法,它使用一些 LINQ 來訪問我的數(shù)據庫中的數(shù)據。我有一些項目正在存儲它們的創(chuàng)建日期。日期包括一個偏移量,因此它在數(shù)據庫中存儲為 datetimeoffset 類型。我正在嘗試按日期過濾項目,為此我需要減去偏移時間來比較它們:public async Task<IEnumerable<Item>> GetItems(DateTime? startDate){    var items = _dbContext.Items                                                        .AsQueryable();    if (startDate != null)    {        items = items.Where(i =>            i.DateCreated.DateTime.AddHours(i.DateCreated.Offset.Hours) >= startDate.Value);    }    return await items                     .ToListAsync();}但是當ToListAsync()被調用時,我得到這個錯誤:因警告“Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning:LINQ 表達式‘where ([e].DateCreated.DateTime.AddHours(Convert([e].DateCreated.Offset.Hours, Double)) >= __startDate_Value_0)”而生成錯誤不被翻譯,將在當?shù)剡M行評估。'。通過將事件 ID“RelationalEventId.QueryClientEvaluationWarning”傳遞給“DbContext.OnConfiguring”或“AddDbContext”中的“ConfigureWarnings”方法,可以抑制或記錄此異常。問題似乎出在AddHours方法上,如果我把它去掉,它就可以正常工作。但我不知道是否有辦法在不使用該方法的情況下使它工作。我可以在這里使用不同的策略嗎?
查看完整描述

2 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

實際上支持DateTime.AddHours方法的翻譯。


問題是目前 EF Core 無法翻譯 的大部分(如果不是全部)成員DateTimeOffset,在這種特殊情況下 -DateTime屬性(與 等相同Offset)DateTimeUtc。


幸運的是它確實支持DateTimeOffset比較的轉換,所以解決方案是換一種方式——將DateTime參數(shù)轉換為DateTimeOffset并在查詢中進行簡單的比較,例如


if (startDate != null)

{

    // Note: must be a variable outside the query expression tree

    var startDateOffset = new DateTimeOffset(startDate.Value);

    items = items.Where(i => i.DateCreated >= startDateOffset);

}


查看完整回答
反對 回復 2022-12-24
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

更新的答案(EF Core):

根據此鏈接DbFunctionsEF Core 當前不支持。

如果您想AddHour使用 EF Core 進行調用,一種選擇是AddHour在您的數(shù)據庫中定義為標量函數(shù),然后您可以在您的 LINQ 查詢中調用它。

本文檔解釋了如何完成:

在您的 DbContext 上聲明一個靜態(tài)方法并使用以下注釋對其進行注釋DbFunctionAttribute

public class MyDbContext : DbContext

{

    [DbFunction]

    public static int AddHours(DataTime source, int hours)

    {

        // you don't need any implementation 

        throw new Exception(); 

    }

}

像這樣的方法會自動注冊。注冊后,對 LINQ 查詢中的方法的調用可以轉換為 SQL 中的函數(shù)調用:


items = items.Where(i =>

    MyDbContext.AddHours(i.DateCreated, i.DateCreated.Offset.Hours) >= startDate.Value);

免責聲明:我個人不喜歡這個解決方案。編寫一個新方法,只是為了拋出一個異常,遠不是一個優(yōu)雅的設計。不幸的是,如果您想使用 EF Core,您沒有太多選擇。


原始答案(EF 4/5/6):

AddHour不是您數(shù)據庫中的函數(shù)。它需要被翻譯成數(shù)據庫中相應的功能。


如果您使用的是 SQL Server,那么您可以使用這段代碼,它將轉換AddHour為相應的 DB 函數(shù):


items = items.Where(i =>

    DbFunctions.AddHour(i.DateCreated, i.DateCreated.Offset.Hours) >= startDate.Value);

如果您不使用 SQL Server,那么您需要AddHour在您的數(shù)據庫中定義函數(shù),定義后您可以使用DbFunctions.AddHour, 來調用它。


查看完整回答
反對 回復 2022-12-24
  • 2 回答
  • 0 關注
  • 125 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號