【问题标题】:'IQueryable' does not contain a definition for 'OrderByDescending'“IQueryable”不包含“OrderByDescending”的定义
【发布时间】:2015-12-11 14:54:22
【问题描述】:

在 where 子句中为 orderby 获取此错误。我这样做是因为以前,如果我没有定义“人”,我会在返回时收到错误,因为人们说“人”这个名字在当前上下文中不存在。我该如何解决这个问题?

 public JsonResult PersonsList(string birthyear)
 {
     TutorialDBContext db = new TutorialDBContext();
     var NumericYear = Convert.ToInt32(birthyear);
     IQueryable people;

     if (birthyear == "All")
     {
          people = from m in db.persons
                   select m;

          people = people.OrderByDescending(s => s.birthdate);
     }
     else
     {
          people = from m in db.persons
                   where m.birthdate.Year >= NumericYear
                   where m.birthdate.Year <= (NumericYear + 9)
                   select m;
     }

     return Json(people, JsonRequestBehavior.AllowGet);
 }

【问题讨论】:

    标签: c# .net linq iqueryable


    【解决方案1】:

    因为确实没有这样的方法。不过有一个接受IQueryable&lt;T&gt;。使用

    IQueryable<Person> people;
    

    或任何合适的元素类型。

    【讨论】:

    • 菜鸟的危险。谢谢人,也是它的人,而不是人
    • 为什么要把它写成“perons”?如果不出意外,类型名称的大写字母在 .Net 中更为惯用。
    • 错字,意思是“人”。我在sql中创建了persons表,实体框架保留了大小写。我同意惯用的部分,这只是一个示例项目,我希望能帮助我的新开发者朋友。
    • 我建议将实体名称更改为Person,并将访问它们的属性名称更改为Persons(或People 是合理的)。个人实体毕竟可能代表一个人。 (如果有的话,一个供任何人使用而不只是您自己的示例项目应该对这些小事更加挑剔,因为示例应该鼓励那些尽可能多地查看它们的人的良好实践)。
    • 不,如果使用了 EDMX 文件,我将编辑该文件,否则只需添加适当的 [Table] 属性,以便表名是小写和复数,但 C# 类名是初始的 -大写和单数。
    【解决方案2】:

    OrderByDescending()IQueryable&lt;T&gt; 的扩展方法,而不是非泛型 IQueryable 的扩展方法。

    所以你需要将people 声明为IQueryable&lt;Person&gt;

    【讨论】:

    • @CodeCaster 我没有投反对票,但OrderByDescending 也是IQueryable&lt;T&gt; 上的扩展方法,尽管我的选择不是投反对票的原因意见。
    • @DStanley 我可以理解,但事实并非如此。扩展方法只能在一种类型上声明,该类型是IEnumerable&lt;T&gt;。这也适用于IQueryable&lt;T&gt; 是因为IQueryable&lt;T&gt; : IEnumerable&lt;T&gt;。通过将措辞更改为您的建议,我基本上是在撒谎(因为如果那样的话,该方法将不适用于IEnumerable&lt;T&gt;...)。不过,感谢您的洞察力,我真的很好奇为什么 Jon 和我的回答在第二次发布时被否决了。我在这个问题的标题上找不到任何相关的问答。
    • 我对所有答案都投了赞成票。现在我的问题也被否决了:x
    • @DStaney yes, really。我猜重载决议会选择派生最多的一个,在这种情况下确实是IQueryable&lt;T&gt; 一个。
    • @CodeCaster 该变量的类型为IQueryable&lt;T&gt;。在查找OrderByEnumerable时,编译器会在IEnumerable&lt;T&gt;的扩展方法之前找到IQueryable&lt;T&gt;的扩展方法,因为声明类型的扩展方法将在派生类型的扩展方法之前选择( s)。
    【解决方案3】:

    正如多次提到的,您需要将people 声明为IQueryable&lt;Person&gt; 或从People 表返回的任何类型。如果你想使用隐式类型,你可以重新排列你的代码:

    var people = from m in db.persons
                 select m;
    if (birthyear == "All")
    {
        people = people.OrderByDescending(s => s.birthdate);
    }
    else
    {
         people = people.Where(p => p.birthdate.Year >= NumericYear
                                 && p.birthdate.Year <= NumericYear + 9)
    }
    

    【讨论】:

    【解决方案4】:
    1. 代码文件开头必须有using System.Linq;
    2. 您应该将IQueryable people; 更改为IQueryable&lt;Person&gt; people;
    3. 如果您使用All 作为birthyear 值调用此方法,您将在到达var NumericYear = Convert.ToInt32(birthyear); 时收到异常
    4. 我建议把整个函数改成这个

      public JsonResult PersonsList(string birthyear)
      {
          using (var db = new TutorialDBContext())
          {
              IQueryable<Person> people;
      
              if (birthyear == "All")
              {
                  people = db.persons.OrderByDescending(s => s.birthdate);
              }
              else
              {
                  var NumericYear = Convert.ToInt32(birthyear);
                  people = from m in db.persons
                      where m.birthdate.Year >= NumericYear
                      where m.birthdate.Year <= (NumericYear + 9)
                      select m;
              }
      
              return Json(people, JsonRequestBehavior.AllowGet);
          }
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2012-04-27
      • 1970-01-01
      • 2019-10-21
      • 2018-05-11
      • 2020-07-15
      • 1970-01-01
      相关资源
      最近更新 更多