2015-09-10 4 views
0

Это запрос, у меня есть:SelectMany не может вывести аргумент?

MyRepeater.DataSource = Objects 
    .GroupBy(p => p.FAC_ID) 
    .Select(p => p.First()) 
    .First().Dipartimento.AreeDipartimento 
    .SelectMany(p => p.Aree); 

, но он говорит, что не может вывести аргументы, используя SelectMany.

Вместо этого, если я:

.SelectMany(p => p.Aree.AREA); 

это работает! Но мне нужна коллекция/список Aree (объект), а не Aree.AREA (строка).

Где я ошибаюсь?

+6

Какой тип 'Aree'?Если это не последовательность, это звучит так, как будто вы выбираете 'Select' вместо' SelectMany'. – Lee

+0

Да, вы правы, похоже, работает! У меня нет различий между ними так ... – markzzz

+1

Что вы пытаетесь достичь вообще? Вы группируетесь по 'FAC_ID', тогда вы просто принимаете произвольную первую из каждой группы, из которой вы произвольно производите объект и так далее. Если вас не интересуют конкретные объекты, вы можете сохранить все и просто «Objects.First»(). Dipartimento.AreeDipartimento ... ' –

ответ

3

Весь запрос делает не так много смысла для меня. Вы группируетесь по FAC_ID, тогда вы произвольно производите первый из каждой группы (без ордера), от тех, которые вы производите произвольный объект. Вы можете достичь того же более эффективным и понятнее:

var obj = Objects.FirstOrDefault(); 

Может быть, вы хотите, чтобы это вместо (только гадать):

MyRepeater.DataSource = Objects 
    .GroupBy(p => p.FAC_ID) 
    .Select(grp => grp.First()) // remove duplicates, keep an arbitrary 
    .SelectMany(p => p.Dipartimento.AreeDipartimento.Select(ad => ad.Aree)); 

Здесь SelectMany выбирает Aree объект из последовательности Dipartimento.AreeDipartimento и сглаживает их всех к единственная последовательность, которая используется как DataSource для ретранслятора.

+0

Это именно то, что я ищу. Ничего себе, умственный человек! Большое спасибо!!! – markzzz

0

Вы должны использовать .SelectMany, если вы соединяете несколько последовательностей, и поэтому аргумент должен быть последовательностью. Если это не так, придерживайтесь метода .Select.

Для получения дополнительной информации, посмотрите здесь: Difference Between Select and SelectMany

0

Я думаю, вы хотите использовать Select здесь, а не SelectMany.

SelectMany предназначен для выбора коллекции в объекте, который вы обрабатываете в своем запросе. Затем выбранные коллекции объединяются в результате.

Например, если вы получили что-то вроде этого:

var a = {Tuple.Create("a", {1, 2, 3}), 
     Tuple.Create("b", {4, 5, 6}), 
     Tuple.Create("c", {7, 8, 9})} 

Вы можете использовать SelectMany, чтобы получить все результирующие значения в Item2 в Tuple вступил в одном списке. a.SelectMany(t => t.Item2) приведет к

{1, 2, 3, 4, 5, 6, 7, 8, 9} 

Выберите с другой стороны, используется для обозначения ровно один результат (и я полагаю, что это то, что вы хотите, так a.Select(t => t.Item1) приведет к {"a", "b", "c"} и a.Select(t => t.Item2) приведет:.

{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 

Так что в целом я думаю, что в вашем случае что-то вроде

MyRepeater.DataSource = Objects.GroupBy(p => p.FAC_ID).Select(p => p.First()) 
           .First().Dipartimento.AreeDipartimento 
           .Select(p => p.Aree); 

будет правильным. Это все советы, которые я могу дать вам без дополнительной информации о вашей структуре данных и ожидаемых результатах.

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