2016-09-06 10 views
0

Я новичок в C#, ASP.NET, MVC, LINQ и почти все, что я делаю. Мы разработали рабочий прототип системы планирования событий, в которой перечислены все события для всех сайтов, независимо от того, какой сайт планирует какое событие. Мы адаптируем прототип к полной версии и теперь хотим, чтобы планировщики видели события только для сайтов, которые они планируют.Возвращение списка целых чисел и использование .contains()

Моя первоначальная попытка состоит в том, чтобы заполнить список целых чисел, содержащих идентификатор сайтов, которые планировщик может планировать. Затем я буду использовать .contains, чтобы определить, находятся ли события в списке зарегистрированных пользователей. Таким образом, у меня есть следующий запрос, который работает (обратите внимание, что пользователь еще не может выбрать несколько сайтов, поэтому я использую .FirstOrDefault(), потому что у нас есть некоторые проблемы с данными, которые мы работаем с клиентом для адресации. Также обратите внимание, что я включал в себя полный способ дополнительно ниже):

int site = (from u in context.Employees 
    join hf in context.SiteHomeFacs on u.Default_Location_Code equals hf.HomeFac 
    where u.User_ID == usr 
    select hf.siteID).FirstOrDefault(); 

var sites = new List<int> {site}; 

return sites; 

Теперь я хочу по умолчанию некоторых ролей, чтобы быть в состоянии планировать все сайты и это, когда я начинаю иметь проблемы (полный метод здесь):

public List<int> GetUserSites(string usr) 
{ 
    try 
    { 
     using (var context = new DBcontext()) 
     { 
      if (HttpContext.Current.User.IsInRole("Owner") || HttpContext.Current.User.IsInRole("Controller")) 
      { 
       var everySite = (from s in context.Sites 
           select new List<int> { s.ID }); 

       return everySite; 

      } 
      var site = (from u in context.Employees 
       join hf in context.SiteHomeFacs on u.Default_Location_Code equals hf.HomeFac 
       where u.User_ID == usr 
       select new List<int> { hf.siteID }).FirstOrDefault(); 

      return sites; 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

Ошибка в 'return everySite' равна:

Невозможно неявно преобразовать тип 'System.Linq.IQueryable>' в 'System.Collections.Generic.List'. Явное преобразование существует (вы пропали без вести броска?)

Мне кажется нелогичным, что запрос был бы приемлем с .FirstOrDefault(), но не без этого. Может ли кто-нибудь помочь мне вернуть список целых значений, чтобы я мог использовать .contains? Или предложить лучший путь для всех?

ответ

0

Для того, чтобы решить эту проблему, вы можете сделать это,

Добавить ToList() в конце, чтобы преобразовать IQueryable результат возвращается к IList,

var everySite = from s in context.Sites select s.ID ;  
return everySite.ToList(); 

EDIT: Для того, для поддержки большого списка вы можете вернуть HashSet, как указано в комментарии ниже,

return new HashSet<int>(everySite); 
+0

Если ваш список долго, и вам нужно сделать много проверок, я бы использовал HashSet вместо List - производительность намного лучше для поиска. вернуть новый HashSet (everySite); –

+0

@ShannonHolsinger Да, вы правы, добавили! – Sajeetharan

+0

Стоит отметить, что 'select new List {s.ID}' должен быть 'select s.ID'. –