2013-07-10 2 views
3

Обычно, когда я использую LINQ to SQL, я могу использовать Count(), чтобы получить количество возвращенных записей. Однако в этом случае метод Count() недоступен, как если бы он не был определен для объекта. Я не знаю, почему это происходит. Вот код:Нет Count() для IQueryable?

 IQueryable departments; 

     if (role == "ADMIN") 
     { 
      departments = 
       db.Departments.Select(d => new {d.DepartmentID, FullName = d.Division.DivisionName + ": " + d.DepartmentName}) 
        .OrderBy(d => d.FullName); 
     } 
     else 
     { 
      departments = 
       db.J_DeptAdmins.Where(jda => jda.AdminUserID == userID) 
        .Select(d => new {d.DepartmentID, FullName = d.Department.Division.DivisionName + ": " + d.Department.DepartmentName}) 
        .OrderBy(d => d.FullName); 

      if (departments.Count() > 0) //Error is here 
      { 
       drpDepartment.Style.Add("display", "none"); 
       lblDisplayDepartment.Style.Add("display", "none"); 
      } 
     } 

ответ

7

Это потому, что вы объявили его в качестве IQueryable вместо IQueryable<T>. См. this link, где определены все сочные методы расширения, которые вы используете:

Теперь я понимаю, почему вы это сделали, когда создаете динамические объекты. Рассмотрите возможность создания класса POCO, ала:

public class MyPOCO 
{ 
    public int DepartmentID { get; set; } 
    public string FullName { get; set; } 
    /* etc... */ 
} 

и затем:

IQueryable<MyPOCO> departments; 

и, очевидно, создавая новые MyPOCO сек вместо динамических объектов.

Редактировать

И как D Stanley отмечает в комментариях, если вы не хотите, чтобы создать ПОКА только для этой операции, если вы объявите departments, как var departments, вы получите правильный тип ,

+2

+1 для связи в одиночку! –

+0

или просто используйте 'var', который станет« List <{anonymoustype}> '. Кроме того, результатом является список анонимных объектов, а не 'dynamic' объектов. –

+0

Невозможно использовать разделы var, потому что мне нужно, чтобы область была вне двух блоков if, и если вы используете var, вы должны инициализировать. – Legion

0

Обнаружено решение в функции new-ish для C#. Я использовал:

IQueryable<dynamic> departments; 

я до этого не видел dynamic, но это, видимо, позволяет использовать анонимные типы дженериков.

+0

Вот что сказал Стэнли в комментариях к моему ответу. Используя 'var', вы по существу получаете то, что вы указали выше. Одним из преимуществ метода POCO является то, что вы получаете согласованный POCO времени компиляции. –

+0

Правда, но в этом случае я не мог использовать var, потому что мне нужно, чтобы объем отделов существовал вне блоков if/else, но я не мог инициализировать его до тех пор, пока внутри блоков if/else. Я думаю, что больше того, что я делал, это первый случай. – Legion

Смежные вопросы