LINQ的不懒负荷如果通过通用的方法调用?(Linq does not lazy load if i

2019-09-18 01:05发布

所以,我有一个方法:我在具有孔的序列计数的数,这个数应该是第一孔或MAX()

    public static int GetRegisterNumber<T>(this IQueryable<T> enumerable, Func<T, bool> whereFunc, Func<T, int?> selectFunc)
    {
        var regNums = enumerable.OrderBy(selectFunc).Where(whereFunc).ToArray();

        if (regNums.Count() == 0)
        {
            return 1;
        }

        for (int i = 0; i < regNums.Count(); i++)
        {
            if (i + 1 != regNums[i])
            {
                return regNums[i].Value + 1;
            }
        }

        return regNums.Last().Value + 1;
    }

我用它,如:

var db = new SomeDataContext();
db.Goals.GetRegisterNumber(g => g.idBudget == 123, g => g.RegisterNumber);

所以,我从LINQ查询一些像期待:

SELECT [t0].[id], [t0].[tstamp], [t0].[idBudget], [t0].[RegisterNumber], FROM [ref].[GoalHierarchy] AS [t0] WHERE [t0].[idBudget] = 123 ORDER BY [t0].[RegisterNumber]

而是我得到:

SELECT [t0].[id], [t0].[tstamp], [t0].[idBudget], [t0].[RegisterNumber], FROM [ref].[GoalHierarchy] AS [t0]

所以LINQ得到所有的表格数据,然后过滤,但这种行为是不能接受的,因为表中包含大量的数据。 有没有什么解决办法吗?

Answer 1:

更改方法签名看起来像这样:

public static int GetRegisterNumber<T>(this IQueryable<T> enumerable, Expression<Func<T, bool>> whereFunc, Expression<Func<T, int?>> selectFunc)

这种方式,将要求相应的扩展方法IQueryable<T> 如果你只有一个Func<TSource, bool> ,它会调用该扩展方法IEnumerable<T>



文章来源: Linq does not lazy load if invoked via generic method?