zoukankan      html  css  js  c++  java
  • 扩展方法解决LinqToSql Contains超过2100行报错问题

    1.扩展方法

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Linq.Expressions;
    using System.Reflection;
    
    namespace Utils
    {
        //http://stackoverflow.com/questions/567963/linq-expression-to-return-property-value/568771#568771
        public static class ContainsExtensions
        {
            public static IEnumerable<T> InRange<T, TValue>(
                    this IQueryable<T> source,
                    Expression<Func<T, TValue>> selector,
                    int blockSize,
                    IEnumerable<TValue> values)
            {
                MethodInfo method = null;
                foreach (MethodInfo tmp in typeof(Enumerable).GetMethods(
                        BindingFlags.Public | BindingFlags.Static))
                {
                    if (tmp.Name == "Contains" && tmp.IsGenericMethodDefinition
                            && tmp.GetParameters().Length == 2)
                    {
                        method = tmp.MakeGenericMethod(typeof(TValue));
                        break;
                    }
                }
                if (method == null) throw new InvalidOperationException(
                       "Unable to locate Contains");
                foreach (TValue[] block in values.GetBlocks(blockSize))
                {
                    var row = Expression.Parameter(typeof(T), "row");
                    var member = Expression.Invoke(selector, row);
                    var keys = Expression.Constant(block, typeof(TValue[]));
                    var predicate = Expression.Call(method, keys, member);
                    var lambda = Expression.Lambda<Func<T, bool>>(
                          predicate, row);
                    foreach (T record in source.Where(lambda))
                    {
                        yield return record;
                    }
                }
            }
            public static IEnumerable<T[]> GetBlocks<T>(
                    this IEnumerable<T> source, int blockSize)
            {
                List<T> list = new List<T>(blockSize);
                foreach (T item in source)
                {
                    list.Add(item);
                    if (list.Count == blockSize)
                    {
                        yield return list.ToArray();
                        list.Clear();
                    }
                }
                if (list.Count > 0)
                {
                    yield return list.ToArray();
                }
            }
        }
    }

    2.调用

    Using Utils;

    void Test()

    {

        var ids=new int[] { 1,2,3 ... 9999 };

        var list=datacontext.TestTable.InRange(ee => ee.Id, 2000, ids).ToList(); 

    }

    解决方案来自:http://stackoverflow.com/questions/567963/linq-expression-to-return-property-value/568771#568771

    From:http://www.cnblogs.com/xuejianxiyang/p/5491750.html

  • 相关阅读:
    点击文本变成输入框
    html代码片段
    node 开启Gzip压缩
    npm 安装与卸载
    console.dir()-----js中console.log()和console.dir()的区别
    javaScript学习笔记之-------this
    javaScript学习笔记之-------闭包
    从零搭建vue项目---VUE从无到有
    require.js扫盲版
    cross-env 解决跨平台设置的NODE_ENV的问题
  • 原文地址:https://www.cnblogs.com/xuejianxiyang/p/5491750.html
Copyright © 2011-2022 走看看