2015-07-30 2 views
-2

Есть коллекциюC# LINQ запроса Всего метод

List<<KeyValuePair<string, Person>> 
public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int MealType { get; set; } 
} 

patientEffort.Add("1", new Person() { FirstName = "Raja", LastName = "Ram", MealType = 2 }); 

patientEffort.Add("2", new Person() { FirstName = "Vijay", LastName = "Anthony", MealType = 1 }); 
patientEffort.Add("2", new Person() { FirstName = "Vijay", LastName = "Anthony", MealType = 2 }); 
patientEffort.Add("2", new Person() { FirstName = "Vijay", LastName = "Anthony", MealType = 3 }); 


patientEffort.Add("3", new Person() { FirstName = "Dr", LastName = "APJ", MealType = 1 }); 
patientEffort.Add("3", new Person() { FirstName = "Dr", LastName = "APJ", MealType = 2 }); 
patientEffort.Add("3", new Person() { FirstName = "Dr", LastName = "APJ", MealType = 3 }); 
patientEffort.Add("3", new Person() { FirstName = "Dr", LastName = "APJ", MealType = 4 }); 
List<int> _listMealType = new List<int>(); 

Если _listMealType = [2] прошло, то результат будет

{Key: "1", FirstName = "Raja", LastName = "Ram"} 
{Key: "2", FirstName = "Vijay", LastName = "Anthony"} 
{Key: "3", FirstName = "Dr", LastName = "APJ"} 

Если _listMealType = [1,2,3] прошел, то результат будет быть

{Key: 2, FirstName = "Vijay", LastName = "Anthony"} 
{Key: 3, FirstName = "Dr", LastName = "APJ"} 

Если _listMealType = [1,2,3,4] прошло, то результат будет

{Key: "3", FirstName = "Dr", LastName = "APJ"} only 

Ключ может быть строкой или int, что не имеет значения. Могу ли я получить запрос linq для этого сценария. Я использовал весь метод linq, но не работал.

var query = patientEffort.Where(d => _listMealType.All(x => x == d.Value.MealType)).Select(d => d.Key); 

Не могли бы вы помочь мне в решении вопроса о запросе как можно скорее.

+6

Ваш пример кода просто смесь фрагментов - это действительно помогло бы, если бы поставить его вместе как короткий, но * полный * пример. Почему вы представляете первое значение как строку, когда предполагается, что это целое число? Что вы ожидаете от типа результата? Вы говорите, что вы использовали All, и это не сработало, но вы не показали *, как вы использовали All, или что произошло. –

+0

Мы можем предположить, что строка тоже int. Верните ключ, который удовлетворяет условию. –

+0

Это не имеет никакого смысла. Строки не совпадают. Пожалуйста, обновите свой вопрос, чтобы быть намного яснее. Точно так же «вернуть ключ» не соответствует результатам, которые вы уже описали. Пожалуйста, прочитайте http://tinyurl.com/stack-hints –

ответ

1

Я надеюсь, что это помогает:

 var patients = patientEffort.GroupBy(x => x.Value.FirstName); 
     var result = (from patient in patients let res = patient.Select(note => note.Value.MealType).ToList() where _listMealType.Intersect(res).Count() == _listMealType.Count select patient.First()).ToList(); 

Вот вариант без использования LINQ:

 var patients = patientEffort.GroupBy(x => x.Value.FirstName); // group patients by name 
     foreach (var patient in patients) 
     { 
      var res = new List<int>(); 
      foreach (var note in patient) // collect all meal types of current patient 
       res.Add(note.Value.MealType); 

      if (_listMealType.Intersect(res).Count() == _listMealType.Count) // if intersection count equal to source meal list - it's our patient. 
       result.Add(patient.First()); // add information about patient. because we need only name - we can use first record in list. 
     } 
+0

Спасибо Артем! Это сработало. –

+0

Это действительно сложно прочитать, я бы разломил этот оператор в IQueryables var, так что следующий человек может поэтапно читать, что происходит –

+0

Не беспокойтесь об этом, обновив его в ответ. Но поскольку владелец спросил о linq - я преобразовал его в linq :) –