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

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

在 EF Core 中適用時強制 SUM 方法返回 NULL

在 EF Core 中適用時強制 SUM 方法返回 NULL

C#
慕勒3428872 2023-07-09 17:05:56
我正在執(zhí)行一個查詢,其中我偶爾期望 NULL,如下所示:.Where(d => d.Id == varid && d.Date >= vardate1 && d.Date <= vardate2) .Sum(d => (decimal?)d.Delta);Delta 是一個不可為空的小數(shù),并且智能感知顯示 Sum 的結果將是一個小數(shù)?因為我介紹了演員陣容。生成的 SQL 符合預期,并且當手動運行時,如果沒有匹配的記錄,它會正確返回 NULL。但是,具體化查詢的結果始終為 0。此行為與非核心 EF 不同,后者會返回 null。這真的是新的預期行為嗎?如果是這樣,我怎樣才能在需要時強制它返回 null?Null 和 0 在這種情況下具有不同的含義。我可以先引入記錄,然后在服務器上求和,但如果 EF core 能夠自行實現(xiàn)我所期望的功能,那就太好了。
查看完整描述

2 回答

?
慕田峪7331174

TA貢獻1828條經(jīng)驗 獲得超13個贊

最有可能是一個錯誤,但了解 EF Core 設計者對不可空Max//和/翻譯的愿景,如果他們故意這樣做是為了模擬(奇怪的)LINQ to ObjectsMin可空行為(通過結果返回事件),我不會感到驚訝方法的類型可以為空。?AverageFirstSingleSum0

通過下面的片段可以看出

decimal??result?=?Enumerable.Empty<decimal?>().Sum();?//?result?is?0

甚至有記錄(?。浚?/p>

評論

source如果不包含任何元素,此方法返回零。

“有趣”的是,這僅適用于根查詢Sum執(zhí)行 - 在投影內(nèi)部它具有您正在尋找的 SQL 行為。

這導致我們通過利用常量技巧與投影相結合的分組來找到解決方法。為了不在您需要的地方重復它,并且如果它在某些更高的 EF Core 版本中得到修復,也可以輕松刪除它,您可以將其封裝在自定義擴展方法中,如下所示:

public static partial class EfCoreExtensions

{

? ? public static decimal? SumOrDefault<T>(this IQueryable<T> source, Expression<Func<T, decimal?>> selector)

? ? ? ? => source.GroupBy(e => 0, selector).Select(g => g.Sum()).AsEnumerable().FirstOrDefault();

}

并替換


.Sum(d => (decimal?)d.Delta);


.SumOrDefault(d => d.Delta);

只需確保僅將其用于最終調(diào)用,因為如果您在查詢表達式樹中使用它,則作為任何自定義方法,它將無法被識別,并將導致客戶端評估或運行時異常。


查看完整回答
反對 回復 2023-07-09
?
繁花不似錦

TA貢獻1851條經(jīng)驗 獲得超4個贊

上述“按常量分組技巧”在 EF Core 5.0 中不起作用。


使用聚合函數(shù)的擴展方法的變體可以實現(xiàn)所需的結果。因此,要讓所有 NULL 返回 Null,否則返回非 null 值的總和:


    public static decimal? SumOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)

        => (from s in source select selector(s))

           .Aggregate((decimal?)null, (acc, item) => acc.HasValue ? acc + item.GetValueOrDefault() : item);

或者,如果您希望任何 NULL 值都會返回 NULL


    public static decimal? SumAllOrNull<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)

        => (from s in source select selector(s))

           .Aggregate((decimal?)null, (acc, item) => acc.HasValue ? acc + item : item.HasValue ? item : null);

但請注意,如上所述,這僅適用于 Linq-to-Objects,不適用于 Linq-to-Sql,因此您需要事先使用 ToList() 或 AsEnumerable(),因此它會從數(shù)據(jù)庫中帶回您可能想要的更多數(shù)據(jù)或需要。


.Where(d => d.Id == varid && d.Date >= vardate1 && d.Date <= vardate2)

.AsEnumerable()

.SumOrDefault(d => d.Delta);


查看完整回答
反對 回復 2023-07-09
  • 2 回答
  • 0 關注
  • 297 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號