2013-11-22 3 views
0

Я работаю над этим запросом, это занимает у меня некоторое время, поскольку я довольно новичок в Linq.Linq Querying On Collection атрибуты и соответствие всем детям

У меня есть две коллекции c.l.ChoreTIs и c.r.ChoreTIs.

Я хочу получить все, где c.l.Chore.TIs.Name == c.r.ChoreTIs.Name, а не ВСЕХ из их параметров (детей) на parameterValue.

Я довольно близко, но все еще есть некоторые проблемы

Dim Query = From l In c.l.ChoreTIs _ 
          Join r In c.r.ChoreTIs On l.Name Equals r.Name _ 
          Where (l.Parameters.All(Function(lp) r.Parameters.Any(Function(rp) lp.parameterValue = rp.parameterValue))) 
          Select New With {.lChore = l, .rChore = r} 

Запрос работает, но я получаю все ChoreTIs, которые соответствуют имя, даже если не все Parameters.parameterValue матч. Мне нужно вернуть все, где НЕ точно совпадают.

Я хочу только те ChoreTI, которые соответствуют имени, но у них нет точно такого же количества детей (параметры) или один параметр имеет другой parameterValue.

Есть ли лучший способ сделать это? или как я могу это исправить?

Приветствие

UPDATE:

Dim Query = From l In c.l.ChoreTIs _ 
          Join r In c.r.ChoreTIs On l.Name Equals r.Name _ 
          Where (l.Parameters.Count <> r.Parameters.Count) Or _ 
            ((l.Parameters.Count = r.Parameters.Count) And 
            (l.Parameters.Select(Function(lp) lp.parameterValue).Except(r.Parameters.Select(Function(rp) rp.parameterValue)).Any())) 
          Select New With {.lChore = l, .rChore = r} 

Я получил его на работу, но я бы до сих пор увлечен, если кто-то есть лучший способ сделать это.

+0

Вы хотите, чтобы все 'ChoreTIs' как из' cl * 'и' cr * ', так и из одного или другого? – Enigmativity

+0

Я хотел бы, чтобы они были двумя, как в двух объектах слева и справа, как select l, c таким образом я мог бы манипулировать двумя из них. Благодаря! – DataAnalyst1

ответ

0

Я думаю, вы можете попробовать использовать пересекаются:

var newData = c.l.ChoreTIs.Select(a => a.Name).Intersect(c.r.ChoreTIs.Select(s => s.Name)); 
+0

Большое спасибо, но мне нужно найти те c.l и c.r ChoreTis, которые соответствуют именам, которые также соответствуют всем их детям в параметреValue и возвращают два объекта. l и r. – DataAnalyst1

0

Мой синтаксис VB не может быть 100% правильно, но это ближе к тому, что вы хотите:

Dim query = _ 
     From l In c.l.ChoreTIs _ 
     Join r In c.r.ChoreTIs On l.Name = r.Name _ 
     Where (l.Parameters.All(Function(lp) r.Parameters.Any(Function(rp) lp = rp))) 
     New From _ 
     { _ 
      l, _ 
      r _ 
     } 
+0

Спасибо, он довольно близко. Я тестировал его, и у меня пока нет его работы. Я использовал ваш запрос, но он не возвращает никакого результата, и я должен получить 1 упражнение в соответствии с моим тестированием. если я изменю строку «lp = rp» на lp.Equals (rp), я ничего не получаю взамен. если я изменю его на lp.parameterValue = rp.parameterValue Я получаю два, когда мне нужно получить только один. Теперь вы ищете исправление. Я ценю вашу помощь – DataAnalyst1

+0

В принципе предложение wheare должно возвращать значение false, когда все дети (параметры) из r соответствуют l в count и parameterValue. – DataAnalyst1

+0

Я обновил исходный запрос до того, что он сейчас – DataAnalyst1

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