'IQueryable' 不包含 'OrderByDescending' 的定义

'IQueryable' does not contain a definition for 'OrderByDescending'

为 where 子句中的 orderby 获取此错误。我这样做是因为以前,如果我没有定义 'people',我会在 return 上收到错误消息,因为人们会说名称 'people' 在当前上下文中不存在。我该如何解决这个问题?

 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);
 }

OrderByDescending()IQueryable<T> 的扩展方法,而不是非泛型 IQueryable.

的扩展方法

因此您需要将 people 声明为 IQueryable<Person>

因为确实没有这种方法。不过,有一个接受 IQueryable<T>。使用

IQueryable<Person> people;

或任何合适的元素类型。

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

    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);
        }
    }
    

如前所述,您需要将 people 声明为 IQueryable<Person> 或从 People table 返回的任何类型。如果你想使用隐式类型,你可以重新排列你的代码:

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)
}