2014-09-24 2 views
0

У меня есть метод контроллера, который не работает. это метод:Запрос LINQ не работает

public ActionResult Index(DateTime? data) 
{ 
    var servizi = (Request["servizi"] ?? "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(n => Convert.ToInt32(n)).ToArray(); 


    if (servizi == null || servizi.Length == 0) 
    { 
     ModelState.AddModelError("servizi", "Selezionare almeno un servizio"); 
     return View(); 
    } 

    var dati = this.GetDbContext().mensilizzazioni.Include(x => x.operatore).Include(x => x.utente).Where(x => x.data1 == data.Value && servizi.Contains(x.id_utente_servizi)); 

    dati = getProfiledDatas(dati.AsQueryable<mensilizzazioni>()); 


    return View(); 
} 

Эти ошибки на LINQ servizi.Contains:

  • Error2 «INT []» не содержит определение для «Содержит» и лучший метод расширения перегрузки 'System.Linq.ParallelEnumerable.Contains (System.Linq.ParallelQuery, TSource)'

  • экземпляр Аргумент Error1: не может преобразовать из 'Int []' до 'System.Linq.ParallelQuery'

Кто может мне помочь, пожалуйста. Спасибо!

+0

Вы' с помощью System.Linq; '? – Rawling

+0

Да, я использую System.Linq – ADC

+0

servizi - тип массива interger, который я предполагаю, а затем вы используете метод contains на нем. – Mukund

ответ

2

Первый выпуск:

Вы конвертируете строку, переданную в массив int, а затем пытается запустить Contains метод на том, что (который не существует на массив).

Попробуйте ToList() вместо этого, так как у него есть метод Contains.

например:

var servizi = (Request["servizi"] ?? "").Split(new[] { ',' }, 
    StringSplitOptions.RemoveEmptyEntries).Select(n => Convert.ToInt32(n)).ToList(); 

Второй вопрос:

Как переменная член оказывается быть int? (т.е. nullable<int>.) Также необходимо изменить второй запрос, чтобы использовать Value недвижимость от id_utente_servizi.

var dati = this.GetDbContext().mensilizzazioni.Include(x => x.operatore).Include(x => x.utente).Where(x => x.data1 == data.Value && servizi.Contains(x.id_utente_servizi.Value)); 

Это предполагает, что id_utente_servizi никогда не нулевой. Если это может нуль быть, вы, возможно, потребуется изменить положение Where, как это: .Where(x => x.data1 == data.Value && x.id_utente_servizi.HasValue && servizi.Contains(x.id_utente_servizi.Value))

+0

Спасибо, но с .ToList() У меня есть эта ошибка: -can не конвертировать из 'int?' to 'int'. Наилучшее перегруженное соответствие метода для 'System.Collections.Generic.List .Contains (int)' имеет некоторые недопустимые аргументы – ADC

+0

Ah. Не знал, что ваше свойство 'id_utente_servizi' может быть нулевым. Обновленный ответ на костюм :) –

+0

О, да! это было так просто ... какой я дурак: D – ADC

0

Что такое тип x.id_utente_servizi? Убедитесь, что это int.

Если я называю .Contains с неправильным аргументом, я получаю несколько подобную ошибку:

servizi.Contains("not an int"); 

«INT []» не содержит определение для «Содержит» и лучший метод расширения перегрузки «System .Linq.Queryable.Contains (System.Linq.IQueryable, TSource)»имеет некоторые недопустимые аргументы

Instance аргумент: не удается преобразовать из 'межд []' на 'System.Linq.IQueryable'

+0

Отображаемая ошибка 'int [] 'не содержит определения для' Contains'', просто до переменной' servizi', являющейся массивом int, который не имеет 'Содержит 'метод. Существует статический 'Array.contains()', но это не так полезно здесь. –

+0

Да, я уверен, что «x.id_utente_servizi» является INT – ADC

+0

@TrueBlueAussie, если у вас есть пространство имен System.Linq, тогда у вас есть. Содержит метод для всех IEnumerable , включая int []. В моем примере, если я передаю int, он работает. Он говорит, что нет метода .Contains, потому что я дал ему неправильный тип, пытаясь воспроизвести ошибку Алессио. – FarmerBob

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