packages/System.Linq.Dynamic.Core.1.0.7.12/src/System.Linq.Dynamic.Core/Extensions/LinqProviderExtensions.cs

(完整代码) 1KB

using System.Reflection;
using JetBrains.Annotations;
using System.Linq.Dynamic.Core.Validation;

namespace System.Linq.Dynamic.Core.Extensions
{
    internal static class LinqProviderExtensions
    {
        /// <summary>
        /// Check if the Provider from IQueryable is a LinqToObjects provider.
        /// </summary>
        /// <param name="source">The IQueryable</param>
        /// <returns>true if provider is LinqToObjects, else false</returns>
        public static bool IsLinqToObjects([NotNull] this IQueryable source)
        {
            Check.NotNull(source, nameof(source));
            Check.NotNull(source.Provider, nameof(source.Provider));

            return IsProviderEnumerableQuery(source.Provider);
        }

        private static bool IsProviderEnumerableQuery(IQueryProvider provider)
        {
            Type baseType = provider.GetType().GetTypeInfo().BaseType;
#if NET35
            bool isLinqToObjects = baseType.FullName.Contains("EnumerableQuery");
#else
            bool isLinqToObjects = baseType == typeof(EnumerableQuery);
#endif
            if (!isLinqToObjects)
            {
                // add support for https://github.com/StefH/QueryInterceptor.Core, version 1.0.1 and up
                if (baseType.Name == "QueryTranslatorProvider")
                {
                    try
                    {
                        PropertyInfo property = baseType.GetProperty("OriginalProvider");
                        IQueryProvider originalProvider = property.GetValue(provider, null) as IQueryProvider;
                        return originalProvider != null && IsProviderEnumerableQuery(originalProvider);
                    }
                    catch
                    {
                        return false;
                    }
                }
            }

            return isLinqToObjects;
        }
    }
}

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。