У меня есть некоторые проблемы с запросом. Я постараюсь сделать это просто понятьLINQ сравнить 2 списка
У меня есть класс, который содержит два атрибута любит это
public class LanguageAndKnowledge{
public String LanguageCode{get;set;}
public int LanguageKnowledge{get;set;}
}
Я использую другой класс, который из EntityFramework отображенной в соответствии с базой данных
public class Student{
...
public virtual ICollection<StudentLanguage> StudentLanguage { get; set; }
}
и класс StudentLanguage ..
public partial class StudentLanguage
{
public int StudentLanguageID { get; set; }
public System.Guid StudentID { get; set; }
public string LanguageCode { get; set; }
public int KnowledgeLevelID { get; set; }
public Nullable<System.DateTimeOffset> C_CreationDate { get; set; }
public virtual Student Student { get; set; }
public virtual Language Language { get; set; }
}
Теперь она с пироги должны быть сложными. У меня есть список LanguageAndKnowledge так это выглядит
List<LanguageAndKnowledge> listLanguageKnowledge;
Так что я начал фильтровать данные на моем объекте Student с запросом, как это и он работает
IQueryable<Student> students = model.Student.Where(stud => stud.StudentStudy.Any(study => selectedStudyType.Contains(study.StudyTypeID.Value)
&& selectedStudyDegree.Contains(study.StudyDegreeID.Value)
&& selectedYears.Contains(study.CompletionDate.Value.Year)));
Второй шаг заключается в выборе от Student.StudentLanguage весь учащийся, у которого есть соответствующие данные из моего списка. Код языка и идентификатор знания являются некоторыми в обоих классах. Но я не понимаю, как я должен построить запрос. Я пробовал разные вещи, например, используя Any(), Contains(), но я не получил то, что хотел. я действительно не понимаю, как я должен сравнить два списка и мне нужна помощь :(
Например, я пытался что-то вроде этого ..
students.Where(stud=> stud.StudentLanguage
.Any(lang=>listLanguageKnowledge.Contains(lang.LanguageCode)&&listLanguageKnowledge.Contains(lang.KnowledgeLevelId);
//or
students.Where(stud=> stud.StudentLanguage
.Any(lang=>listLanguageKnowledge.Any(lang.LanguageCode)&&listLanguageKnowledge.Any(lang.KnowledgeLevelId);
Редактировать
данных
StudentLanguage
Stud1 EN 4
Stud1 NL 4
Stud1 FR 4
Stud2 FR 3
Stud2 NL 4
Stud3 RU 4
Stud3 NL 4
Stud3 FR 2
List<LanguageAndKnowledge>
RU 4
NL 4
FR 4Ожидаемый результат: Stud1
Поэтому я должен получить все данные, соответствующие этому списку.Мне нужно, чтобы получить весь студент, который имеет код и правильный идентификатор знания
Просьба предоставить данные вашего образца и ожидаемый результат. – aush
В ваших попытках я уверен, что вы по-прежнему выполняете одно сравнение (студенты, у которых это свойство 1 имеет это 1 точное значение), но на самом деле вам нужно сделать это несколько раз и обобщить результаты (учащиеся, где a или b или c ...). Есть много маршрутов, которые вы могли бы предпринять, но самым простым было бы перебирать одну коллекцию с циклом for, вызывать, где в другой коллекции внутри нее, и добавлять результаты в коллекцию, которую вы выделяете до цикла. После цикла вы, вероятно, должны дедупировать список. Надеюсь, что это поможет вам в правильном направлении. – evanmcdonnal
Вы назначили результат студентам. Где (..) обратно к переменной студентов? В вашем примере в конце вашего вопроса, результат .Where отбрасывается. Например. изменить его на студентов = студентов. Где (....); – Sam