无法从使用错误中推断出方法的类型参数

时间:2015-04-21 10:12:04

标签: c# linq linq-to-entities

我有一个通用的分页方法,我试图调用它。 但我得到一个编译时错误: 无法从使用

推断出方法的类型参数

方式:

public static IQueryable<T> OrderedPagedResults<T, TResult, TType>(IQueryable<T> query, int pageNum, int pageSize,
                        Expression<Func<T, TResult>> orderByProperty, bool isAscendingOrder, out int rowsCount,
                        List<KeyValuePair<Expression<Func<T, TType>>, bool>> lstThenByConditions = null)
        {
            if (pageSize <= 0) pageSize = 20;

            rowsCount = query.Count();

            if (rowsCount <= pageSize || pageNum <= 0) pageNum = 1;

            var excludedRows = (pageNum - 1) * pageSize;

            query = isAscendingOrder ? query.OrderBy(orderByProperty) : query.OrderByDescending(orderByProperty);

            if (lstThenByConditions != null && lstThenByConditions.Any())
            {
                foreach (var thenByProperty in lstThenByConditions)
                {
                    if (!thenByProperty.Equals(default(KeyValuePair<Expression<Func<T, TType>>, bool>))
                        && (typeof(IOrderedQueryable<T>).IsAssignableFrom(query.Expression.Type)))
                    {
                        query = thenByProperty.Value

                            ? (query as IOrderedQueryable<T>).ThenBy(orderByProperty)

                            : (query as IOrderedQueryable<T>).ThenByDescending(orderByProperty);
                    }
                }
            }

            return query.Skip(excludedRows).Take(pageSize);
        }

我试图将其调用为:

var resultset = OrderedPagedResults(employees, pageNum, rowNum,
                                o => o.JoiningDate, isSortAscending, out totalRows);

员工= IQueryable 由于某种原因,我得到这个编译时错误,我无法调用它。

有什么建议我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

编译器虽然相当聪明,但并不总是能够推断泛型类型,例如这里的情况,因为有多种泛型类型。它是如何知道它们应该是什么的?你需要更明确:

var resultset = OrderedPagedResults<IEnumerable<Employee>, int, int>
(employees, pageNum, rowNum, o => o.JoiningDate, isSortAscending, out totalRows);

(我猜那里的类型)

Eric Lippert在某个地方有一个很好的解释,但我不记得它在哪里。

答案 1 :(得分:2)

Stuart Grassie的回答是正确的,但省略了详细说明您获得错误的原因。 在您的示例中,编译器应该从哪个参数推导出您打算用于类型参数TType 的类型参数?

我找不到任何这样的论点;编译器也不能,因此你没有给它足够的信息来推断出类型。