【问题标题】:Linq does not lazy load if invoked via generic method?如果通过泛型方法调用,Linq 不会延迟加载?
【发布时间】:2009-07-08 14:10:46
【问题描述】:

所以,我有一个方法:我正在数一个有洞的序列中的数字,这个数字应该是第一个洞或 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 获取所有表数据,然后对其进行过滤,但这种行为是不可接受的,因为表包含大量数据。有什么解决办法吗?

【问题讨论】:

    标签: linq-to-sql lazy-loading


    【解决方案1】:

    将您的方法签名更改为如下所示:

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

    这样它将为IQueryable&lt;T&gt; 调用适当的扩展方法。如果你只有一个Func&lt;TSource, bool&gt;,它会调用IEnumerable&lt;T&gt;的扩展方法。

    【讨论】:

    • +1 来自我。我的回答没有帮助,因为我误读了这个问题,所以我把它删除了。
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多