【问题标题】:The type arguments for method System.Linq.Enumerable.OrderBy cannot be inferred from the usageSystem.Linq.Enumerable.OrderBy 方法的类型参数无法从用法中推断出来
【发布时间】:2023-04-02 17:47:01
【问题描述】:

我正在尝试按照 link 中的演示将 jqGrid 添加到 MVC 应用程序。

我有一个名为 Companies 的表,我试图在网格中显示它。公司只包含一个 ID 和一个名称。

我的控制器功能出现错误:

public JsonResult DynamicGridData(string sortIndex, string sortOrder, int page, int rows)
{
    int pageIndex = Convert.ToInt32(page) - 1;
    int pageSize = rows;

    var companies = companiesRepository.Companies.OrderBy(sortIndex + " " + sortOrder).Skip(pageIndex * pageSize).Take(pageSize);
    //Error here

    ...
}

我在调用 OrderBy() 的行上遇到错误:

无法从用法中推断方法“System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable, System.Func)”的类型参数。尝试明确指定类型参数。

我真的不知道错误是什么意思,也找不到解释。我不确定是什么导致了简单的 OrderBy 函数出现此错误。

【问题讨论】:

  • 核心项目只需添加using System.Linq.Dynamic;using System.Linq.Dynamic.Core;

标签: c# asp.net asp.net-mvc linq-to-sql


【解决方案1】:

如果您引用System.Linq.Dynamic,请不要忘记添加using System.Linq.Dynamic; 如果你引用System.Linq.Dynamic.Core,别忘了加上using System.Linq.Dynamic.Core;

【讨论】:

    【解决方案2】:
    1. 将引用 System.Linq.Dynamic.dll 添加到您的项目中。
    2. 然后,添加命名空间:using System.Linq.Dynamic;

    【讨论】:

    • 在 .net core 或 ef core 中不存在。有其他选择吗?
    【解决方案3】:

    我知道这是我的小学生错误,但我得到了同样的错误“CS0411 方法'Enumerable.OrderBy(IEnumerable, Func)' 的类型参数无法从用法中推断出来。尝试指定类型显式参数。”。

    原来我排序的“属性”实际上是一个函数,我省略了“()”。我花了好几年才找到!

    在我的代码摘录中:

    return _numbers.Values.OrderBy(x => x.TotalScore);
    

    应该是

    return _numbers.Values.OrderBy(x => x.TotalScore());
    

    只是想我会提到它......

    【讨论】:

    • 可能不是正确的地方,但你救了我的命。
    • 谢谢,这解决了我的问题。我认为某些东西是属性而不是函数...
    【解决方案4】:

    这个问题的具体答案是你需要添加

    using System.Linq.Dynamic;
    

    并且您需要在项目中添加对Dynamic.DLL 的引用。

    【讨论】:

    • 这应该是正确的答案。不知道为什么这不被接受为答案。
    • 在我的情况下它使用 System.Linq.Dynamic.Core;并且不使用 System.Linq.Dynamic。注意核心
    • 使用 System.Linq.Dynamic.Core;确实有必要,至少在 .net 5.0
    【解决方案5】:

    如果您查阅了您正在调用的方法 (Enumerable.OrderBy) 的文档,您就会知道该参数是 Func<TSource, TKey> 而不是字符串。

    无法从用法中推断方法“System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable, System.Func)”的类型参数。尝试明确指定类型参数。

    编译器试图弄清楚字符串参数实际上是一个 Func 的原因,然后决定它无法确定 TSource 是什么以及 TKey 是什么。它要求您通过在调用中指定这些类型来提供帮助,如下所示:

    companiesRepository.Companies.OrderBy<Company, int>(sortIndex + " " + sortOrder)
    

    如果你这样做了,那么编译器会告诉你字符串不是一个正确的参数,因为现在它有足够的信息来知道这一点。

    【讨论】:

    • 那也不会编译。它需要一个委托,而不是一个字符串。
    • 是的,我就是这么说的。我不是想教他如何做他想做的事,我只是想解释编译器在说什么。
    【解决方案6】:

    你不能OrderBy一个字符串;你需要传递一个 lambda 表达式或委托。

    您需要使用Dynamic LINQ,如教程中所述。

    【讨论】:

    • 你有一个例子来说明我如何做到这一点吗?
    • 你只需要包含库和命名空间。
    • 我正在尝试使用动态 LINQ。问题是我不知道我正在排序的属性。我将它作为字符串传递。如何将字符串转换为 lambda 表达式?
    • 如果你使用动态 LINQ,你可以传递一个字符串。否则,您需要构建一个表达式树。
    • 我无法传递字符串,我的 OrderBy() 函数没有将字符串作为参数。它期待 System.Linq.Expressions.Expression>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多