2014-11-05 3 views
1

Как новичок с C# и LINQ, я довольно запутался в реализации конкретного запроса, который я пытаюсь выполнить. У меня есть массив одного определенного класса, который называется Session. Одним из свойств этого класса является массив из ActiveConnection, другого класса. Каждый ActiveConnection содержит перечисление для ProcessType.Запрос LINQ для вложенного класса

Вот цель: мне нужно определить, какие объекты Session из указанного массива содержат ActiveConnection с ProccessType.Guest. После большого количества возиться, у меня есть мой код ниже (который даже не компилируется).

// Creating my array Session[] 
var sessions = GetSessions(); 

var busySessions = from sessions 
        where sessions.ActiveConnections.ProcessType != ProcessType.Guest 
        select sessions; 

// Do other stuff with this array of busy sessions 

Очевидно, что я не понимаю, как реализовать запрос LINQ. Любая помощь будет принята с благодарностью.

ответ

4

Вам нужен вложенный запрос для этого (так как ActiveConnections коллекция):

var result = sessions.Where(session => session.ActiveConnections.Any(conn => conn.ProcessType == ProcessType.Guest)); 

Это будет возвращать все сеансы, где Guest находится в ActiveConnections списке (который является то, что вы сказал). Для того, чтобы делать то, что ваш код сделал, вам потребуется:

var result = sessions.Where(session => session.ActiveConnections.All(conn => conn.ProcessType != ProcessType.Guest)); 
+0

Dang это ты меня избил! – IronMan84

1

Вы можете сделать:

var busySessions = sessions.ToList().Where(s => s.ActiveConnections.Any(ac => ac.ProcessType != ProcessType.Guest)).Select(); 

ИЛИ

var busySessions = (from s in sessions 
        where s.ActiveConnections.Any(ac => ac.ProcessType != ProcessType.Guest) 
        select sessions).ToList(); 
1

Вы должны объявить переменную в предложении from, представлять каждый элемент в источнике:

from session in GetSessions() 

Затем выполнить подзапрос на весь набор активных соединений:

where session 
    .ActiveConnections 
    .Any(connection => connection.ProcessType != ProcessType.Guest) 

Наконец, вы выбираете сессии, которые удовлетворяют критериям:

select session 

Полный запрос:

from session in GetSessions() 
where session 
    .ActiveConnections 
    .Any(connection => connection.ProcessType != ProcessType.Guest) 
select session 
Смежные вопросы