2015-05-28 2 views
-1
public void GetMuscles(List<ListItem> selected) 
{ 
    int[] arrayOfStrings = new int[selected.Count]; 

    for (int i = 0; i < selected.Count; i++) 
    { 
     arrayOfStrings[i] = Convert.ToInt32(selected[i].Value); 
    } 
} 

using (var db = new DWSEntities()) 
{ 
    var muscles = (from m in db.Muscles 
     where m.MainMusleGroupID. //ISSUE 
     select new { m.MusleName, m.ID }).Take(40); 
} 

В котором выражение, которое мне нужно использовать, содержит, но после слова «.». У меня нет возможности использовать contains. Я пробовал то же самое с не целочисленным значением, и он появляется. У меня есть целочисленный массив и требуется WHERE IN. Итак, есть ли другой способ сделать это без использования или как я могу использовать contains с целыми значениями?Entity Framework содержит целочисленный массив

+2

'в' инвертируется т.е.' где MyIntArray.Contains (m.MainMusleGroupID) '(и в лямбда' дБ .Muscles.Where (m => MyIntArray.Contains (m.MainMusleGroupID) .Select ... ') – StuartLC

+0

Я тоже пробовал это, но получаю еще одну ошибку, например:« int [] не содержит определения для «Содержит» и best extension overload ... " – CanESER

+0

Убедитесь, что у вас есть' using System.Linq; 'в верхней части вашего файла кода .cs. – StuartLC

ответ

1

Я нашел решение. Просто я добавил (интермедиат) здесь:

m => arrayOfInts.Contains((int)m.MainMusleGroupID) 

это работает код ниже:

var arrayOfInts = selected.Select(s => Convert.ToInt32(s.Value)).ToArray(); 
      using (var db = new DWSEntities()) 
      { 
       var muscles = db.Muscles.Where(m => arrayOfInts.Contains((int)m.MainMusleGroupID)) 
             .Select(m => new { m.MusleName, m.ID }).Take(40); 



       cblMusle.DataSource = muscles.ToList(); 
       cblMusle.DataTextField = "MusleName"; 
       cblMainMuscle.DataValueField = "ID"; 
       cblMusle.DataBind(); 
      } 
2

Мой комментарий

Sql WHERE... IN инвертируется в Linq т.е.

where MyIntArray.Contains(m.MainMusleGroupID) 

или в синтаксисе лямбда

db.Muscles.Where(m => MyIntArray.Contains(m.MainMusleGroupID) 

Re: ИНТ [] не содержит определения для " Содержит

В верхней части класса, чтобы иметь:

using System.Linq; 

(и комментарий ниже) Убедитесь, что тип поля Entity, используемого в Contains соответствует типу коллекции сравниваемых to, т.е. MainMusleGroupID должен быть целым числом, для использования с arrayOfInts.Contains().

Re: Рефакторинг

именования arrayOfStrings, чтобы указать массив целого числа (или на самом деле, другой числовой тип, например, long) вызовет проблемы ремонтопригодности.

Вы можете упростить создание arrayOfX[] массива с помощью LINQ: (обратите внимание, у вас есть дополнительные } между for петлей и using):

var arrayOfLongs = selected.Select(s => Convert.ToInt64(s.Value)).ToArray(); 

Результат

var muscles = (from m in db.Muscles 
    where arrayOfLongs.Contains(m.MainMusleGroupID) 
    select new { m.MusleName, m.ID }).Take(40); 

Или в синтаксисе лямбда:

var musclesLambda = db.Muscles 
    .Where(m => arrayOfLongs.Contains(m.MainMusleGroupID)) 
    .Select(m => new { m.MusleName, m.ID }) 
    .Take(40); 

(Я изменил название массива в соответствии с типом)

+0

Такая же ошибка «int [] не содержит определения для« Contains »и лучшей перегрузки расширения ...» :(Я думаю, что это просто для строковых значений. Cos работает, если я использую строковые значения. – CanESER

+0

Хорошо, я думаю [ это] (http://stackoverflow.com/q/1069106/314291) может быть проблемой - 'MainMusleGroupID', вероятно, не является' int' - возможно, вы внесли некоторые изменения модели (например, в 'Enum') или возможно, это 'Guid', Varchar или другой тип. Тип' arrayOfStrings' необходимо будет соответствующим образом скорректировать. – StuartLC

+0

hmmmm, это может быть ... Я снова проверю и отвечу u. – CanESER

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