最近、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 を呼び出すときに、このキー エラーはどういう意味ですか?