2010-03-03 3 views
2

Мне нужно бросить: - IQueryable<Child>.IQueryable Parent-Child

IQueryable<PARENT> query = GetParents(); 

IQueryable<CHILD> result = query.Select(t => t.Children); 

Это не работает, не удалось преобразовать EntitySet в IQueryable. Благодаря

+1

Когда вы имеете в виду приведение в действие, это означает, что вы можете использовать 'Parent' для' Child', то есть родительский наследует от дочернего элемента или реализует тот же интерфейс, хотя это противоречит IQueryable . – AxelEckenberger

+0

Да, они имеют ассоциацию сущностей в базе данных, поэтому ребенок наследует от родителя. Ваш метод работает, но по какой-то причине создает некоторые дубликаты. – Victor

+0

Изменен мой ответ. Однако отношения, которые вы описываете, являются отношением 1: n. То есть У родителя есть несколько дочерних элементов, и у каждого ребенка есть родитель. Наследование отличается! Он описывает корабль отношения типа, например. Огурец относится к типу Овощ. Когда вы получаете дубликаты, это означает, что (в случае отношения 1: n) у вас есть несколько записей с одинаковыми значениями в вашей дочерней таблице. – AxelEckenberger

ответ

0

Использование:

IQueryable<CHILD> result = query.SelectMany(t => t.Children); 

Запрос возвращает все элементы cild родителя, Чайлдс ссылаться несколько родителей будут возвращены несколько раз.

Чтобы использовать различные строки, вам нужно будет реализовать класс, который реализует IComparer, хотя бы для пользовательской фильтрации. Distinct() будет рассматривать экземпляры, а не значения.

IQueryable<CHILD> result = query.SelectMany(t => t.Children) 
           .Distict(new Comparer<CHILD>()); 

Distinct() удаляет дубликаты запроса.

Aternatively вы можете использовать группировку, чтобы создать группировку для детей:

IEnumerable<CHILD> result = query.SelectMany(t => t.Children) 
           .GroupBy(x => new CHILD { 
             id = x.id 
             // add other properties here 
           }) 
           .Select(g => g.Key); 

Вместо new CHILD { } вы можете также использовать new { } создать анонимный результат, в этом случае вы должны заменить IEnumerable<CHILD> с var.

Чтобы выполнить приведение типа в Linq можно использовать - хотя я предположил бы, что это не будет работать в вас случае:

someQuery.OfType<TypeToCastTo>().Cast<TypeToCastTo>(); 

OfType<T>() фильтрует элементы, чтобы Cast<T>() может выполнить приведение типа.

+0

Благодарим за сообщение. – Victor

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