2

最近、2 人の顧客から次のスタック トレースのエラー レポートを受け取りました (名前空間は ***** に置き換えられました)。

[ArgumentException: Item has already been added. Key in dictionary: 'Boolean Single[Boolean](System.Collections.Generic.IEnumerable`1[System.Boolean])'  Key being added: 'Boolean Single[Boolean](System.Collections.Generic.IEnumerable`1[System.Boolean])']
System.Reflection.CerHashtable`2.Insert(K[] keys, V[] values, Int32& count, K key, V value) +9600475
System.Reflection.CerHashtable`2.Preallocate(Int32 count) +307
System.RuntimeTypeCache.GetGenericMethodInfo(RuntimeMethodHandleInternal genericMethod) +299
System.RuntimeType.GetMethodBase(RuntimeType reflectedType, RuntimeMethodHandleInternal methodHandle) +543
System.RuntimeType.GetMethodBase(RuntimeType reflectedType, IRuntimeMethodInfo methodHandle) +25
System.Reflection.MethodBase.GetMethodFromHandle(RuntimeMethodHandle handle) +27
*****.Core.Repositories.Common.IsThereAnAuthorizedUserManager() +383
*****.Client.Host.WebLogin.Login.Page_Load(Object sender, EventArgs e) +334
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +91
System.Web.UI.Control.LoadRecursive() +74
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207

IsThereAnAuthorizedUserManager() 関数は次のとおりです。

public bool IsThereAnAuthorizedUserManager()
{
    return context.Users.Any(u => u.IsEnabled && u.DeletionDate == null && u.UserRoles.Any(ur => ur.Role.RoleOperations.Any(ro => ro.OperationType == (int)OperationType.ManageUsers)));
}

このステートメントから出力される SQL は次のとおりです。

exec sp_executesql N'SELECT 
(CASE 
    WHEN EXISTS(
        SELECT NULL AS [EMPTY]
        FROM [dbo].[User] AS [t0]
        WHERE ([t0].[IsEnabled] = 1) AND ([t0].[DeletionDate] IS NULL) AND (EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [dbo].[UserRole] AS [t1]
            WHERE (EXISTS(
                SELECT NULL AS [EMPTY]
                FROM [dbo].[Role] AS [t2], [dbo].[RoleOperation] AS [t3]
                WHERE ([t3].[OperationType] = @p0) AND ([t2].[RoleID] = [t1].[RoleID]) AND ([t3].[RoleID] = [t2].[RoleID])
                )) AND ([t1].[UserID] = [t0].[UserID])
            ))
        ) THEN 1
    ELSE 0
 END) AS [value]',N'@p0 int',@p0=102

.Any() は常に単一のブール値の結果を返す必要があるため、これがどのようにしてエラーがスローされるかはわかりません。テストではまだ再現できておらず、ユーザーに IIS をリセットしてもらうことで修正されるようです。

このように .Any() をチェーンすることには固有の問題がありますか? それとも、私が見ていないだけで、私たちが間違っていることはありますか? 「修正」の現在の計画は、ステートメントを、.NET Framework が関与する必要なく同じロジックを実行するスカラー値 SQL 関数の呼び出しに置き換えることですが、これはそうすべきであるように思われます。必要ありません。

参考までに、これは次の質問と非常によく似ているように思われます: MethodInfo.MakeGenericMethod を呼び出すときに、このキー エラーはどういう意味ですか?

4

0 に答える 0