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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

LINQ where 子句中的 DateTime 屬性錯(cuò)誤

LINQ where 子句中的 DateTime 屬性錯(cuò)誤

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

2 回答

?
翻翻過去那場(chǎng)雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊

實(shí)際上支持DateTime.AddHours方法的翻譯。


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


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


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);

}


查看完整回答
反對(duì) 回復(fù) 2022-12-24
?
慕俠2389804

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊

更新的答案(EF Core):

根據(jù)此鏈接,DbFunctionsEF Core 當(dāng)前不支持。

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

本文檔解釋了如何完成:

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

public class MyDbContext : DbContext

{

    [DbFunction]

    public static int AddHours(DataTime source, int hours)

    {

        // you don't need any implementation 

        throw new Exception(); 

    }

}

像這樣的方法會(huì)自動(dòng)注冊(cè)。注冊(cè)后,對(duì) LINQ 查詢中的方法的調(diào)用可以轉(zhuǎn)換為 SQL 中的函數(shù)調(diào)用:


items = items.Where(i =>

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

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


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

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


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


items = items.Where(i =>

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

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


查看完整回答
反對(duì) 回復(fù) 2022-12-24
  • 2 回答
  • 0 關(guān)注
  • 135 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)