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

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

哪種方法執(zhí)行得更好:.Any()vs.Count()>0?

哪種方法執(zhí)行得更好:.Any()vs.Count()>0?

撒科打諢 2019-06-24 15:27:40
哪種方法執(zhí)行得更好:.Any()vs.Count()>0?在System.Linq命名空間,我們現(xiàn)在可以擴展IEnumerable就是擁有Any()和Count() 可拓方法.最近有人告訴我,如果我想檢查一個集合中包含一個或多個項目,我應(yīng)該使用.Any()擴展方法,而不是.Count() > 0方法,因為.Count()擴展方法必須遍歷所有項。第二,一些集合有一個財產(chǎn)(不是擴展方法)Count或Length..是否最好使用這些,而不是.Any()或.Count() ?是嗎?
查看完整描述

3 回答

?
呼如林

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

如果您是從具有.Length.Count(如ICollection<T>IList<T>List<T>,等等)-那么這將是最快的選擇,因為它不需要通過GetEnumerator()/MoveNext()/Dispose()所需序列Any()檢查是否為非空的IEnumerable<T>順序。

只為IEnumerable<T>,然后Any()將要一般要更快,因為它只需要看一次迭代。但是,請注意,Count()檢查ICollection<T>(使用.Count作為一種優(yōu)化)-如果您的底層數(shù)據(jù)源是直接一個清單/集合,不會有太大的差別。別問我為什么它不使用非通用的ICollection...

當然,如果您使用LINQ來過濾它,等等(Where(等等),您將有一個基于迭代器塊的序列,因此ICollection<T>優(yōu)化是無用的。

一般IEnumerable<T>*堅持Any();-p


查看完整回答
反對 回復(fù) 2019-06-24
?
喵喔喔

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

當實體框架4是實際的時候,我寫了這個答案。這個答案的目的不在于涉及瑣碎的問題。.Any()VS.Count()性能測試。關(guān)鍵是要表明EF遠非十全十美。新版本更好.。但是,如果您的代碼部分速度慢,并且使用EF,則使用直接TSQL進行測試,并比較性能,而不是依賴于假設(shè)(即.Any()總是比.Count() > 0).


雖然我同意大多數(shù)人投票通過的回答和評論-特別是在這一點上Any信號開發(fā)意圖Count() > 0-在SQLServer(EntityFramework4)上,計數(shù)按數(shù)量級計算得更快。

下面是查詢Any超時異常(在~200.000條記錄上):

con = db.Contacts.
    Where(a => a.CompanyId == companyId && a.ContactStatusId <= (int) Const.ContactStatusEnum.Reactivated
        && !a.NewsletterLogs.Any(b => b.NewsletterLogTypeId == (int) Const.NewsletterLogTypeEnum.Unsubscr)
    ).OrderBy(a => a.ContactId).
    Skip(position - 1).
    Take(1).FirstOrDefault();

Count版本以毫秒為單位執(zhí)行:

con = db.Contacts.
    Where(a => a.CompanyId == companyId && a.ContactStatusId <= (int) Const.ContactStatusEnum.Reactivated
        && a.NewsletterLogs.Count(b => b.NewsletterLogTypeId == (int) Const.NewsletterLogTypeEnum.Unsubscr) == 0
    ).OrderBy(a => a.ContactId).
    Skip(position - 1).
    Take(1).FirstOrDefault();

我需要找到一種方法來查看兩個LINQ所產(chǎn)生的確切SQL-但很明顯,兩者之間的性能差別很大。CountAny在某些情況下,不幸的是,你似乎不能就這樣Any在任何情況下。

編輯:這里是生成的SQL。如你所見;)

ANY:

exec sp_executesql N'SELECT TOP (1) 
[Project2].[ContactId] AS [ContactId], 
[Project2].[CompanyId] AS [CompanyId], 
[Project2].[ContactName] AS [ContactName], 
[Project2].[FullName] AS [FullName], 
[Project2].[ContactStatusId] AS [ContactStatusId], 
[Project2].[Created] AS [Created]
FROM ( SELECT [Project2].[ContactId] AS [ContactId], [Project2].[CompanyId] AS [CompanyId], [Project2].[ContactName] AS [ContactName],
 [Project2].[FullName] AS [FullName], [Project2].[ContactStatusId] AS [ContactStatusId], [Project2].[Created] AS [Created], row_number() 
 OVER (ORDER BY [Project2].[ContactId] ASC) AS [row_number]
    FROM ( SELECT 
        [Extent1].[ContactId] AS [ContactId], 
        [Extent1].[CompanyId] AS [CompanyId], 
        [Extent1].[ContactName] AS [ContactName], 
        [Extent1].[FullName] AS [FullName], 
        [Extent1].[ContactStatusId] AS [ContactStatusId], 
        [Extent1].[Created] AS [Created]
        FROM [dbo].[Contact] AS [Extent1]
        WHERE ([Extent1].[CompanyId] = @p__linq__0) AND ([Extent1].[ContactStatusId] <= 3) AND ( NOT EXISTS (SELECT 
            1 AS [C1]
            FROM [dbo].[NewsletterLog] AS [Extent2]
            WHERE ([Extent1].[ContactId] = [Extent2].[ContactId]) AND (6 = [Extent2].[NewsletterLogTypeId])
        ))
    )  AS [Project2]
)  AS [Project2]
WHERE [Project2].[row_number] > 99
ORDER BY [Project2].[ContactId] ASC',N'@p__linq__0 int',@p__linq__0=4

COUNT:

exec sp_executesql N'SELECT TOP (1) 
[Project2].[ContactId] AS [ContactId], 
[Project2].[CompanyId] AS [CompanyId], 
[Project2].[ContactName] AS [ContactName], 
[Project2].[FullName] AS [FullName], 
[Project2].[ContactStatusId] AS [ContactStatusId], 
[Project2].[Created] AS [Created]
FROM ( SELECT [Project2].[ContactId] AS [ContactId], [Project2].[CompanyId] AS [CompanyId], [Project2].[ContactName] AS [ContactName],
 [Project2].[FullName] AS [FullName], [Project2].[ContactStatusId] AS [ContactStatusId], [Project2].[Created] AS [Created],
  row_number() OVER (ORDER BY [Project2].[ContactId] ASC) AS [row_number]
    FROM ( SELECT 
        [Project1].[ContactId] AS [ContactId], 
        [Project1].[CompanyId] AS [CompanyId], 
        [Project1].[ContactName] AS [ContactName], 
        [Project1].[FullName] AS [FullName], 
        [Project1].[ContactStatusId] AS [ContactStatusId], 
        [Project1].[Created] AS [Created]
        FROM ( SELECT 
            [Extent1].[ContactId] AS [ContactId], 
            [Extent1].[CompanyId] AS [CompanyId], 
            [Extent1].[ContactName] AS [ContactName], 
            [Extent1].[FullName] AS [FullName], 
            [Extent1].[ContactStatusId] AS [ContactStatusId], 
            [Extent1].[Created] AS [Created], 
            (SELECT 
                COUNT(1) AS [A1]
                FROM [dbo].[NewsletterLog] AS [Extent2]
                WHERE ([Extent1].[ContactId] = [Extent2].[ContactId]) AND (6 = [Extent2].[NewsletterLogTypeId])) AS [C1]
            FROM [dbo].[Contact] AS [Extent1]
        )  AS [Project1]
        WHERE ([Project1].[CompanyId] = @p__linq__0) AND ([Project1].[ContactStatusId] <= 3) AND (0 = [Project1].[C1])
    )  AS [Project2]
)  AS [Project2]
WHERE [Project2].[row_number] > 99
ORDER BY [Project2].[ContactId] ASC',N'@p__linq__0 int',@p__linq__0=4

似乎純粹的Where With比計算Count然后使用count=0執(zhí)行WHERE要糟糕得多。

如果你們看到我的發(fā)現(xiàn)有什么錯誤請告訴我。不管對VS計數(shù)的討論如何,都可以從這一切中刪除任何更復(fù)雜的LINQ,當將其重寫為存儲過程時,情況要好得多;)。


查看完整回答
反對 回復(fù) 2019-06-24
  • 3 回答
  • 0 關(guān)注
  • 992 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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