RAFish0404 Ответов: 1

Linq двухуровневый фильтр


Я не смог заставить двухуровневый фильтр работать с помощью Linq.

Расклеили несколько

1) xml-выдержка и
2) фрагмент кода с двумя объектами данных, LineItem и LineList и запросом.

Цель firstQuery-создать список объектов LineList, каждый из которых имеет подсписок, содержащий один или несколько объектов LineItem.

Я хочу начать с фильтрации по атрибуту уровня раздела (section) (lvl), чтобы сузить свой поиск. Во-вторых, я хочу выбрать подраздел (подраздел), в зависимости от элемента("подраздел").Атрибут ("ssn").

Объединенный оператор "where" показывает намерение моего фильтра.

Он проверяет только первое вхождение lvl и ssn и не углубляется в раздел, чтобы проверить следующее значение ssn, если первое не совпадает.

Я пробовал различные способы добавления дополнительного уровня предложений " от " и "где", но я не могу точно определить порядок и синтаксис, чтобы заставить его работать. Я был бы признателен за любые конструктивные комментарии или подсказки, чтобы заставить двухуровневый запрос Linq работать.

Спасибо

<mainxml>
<section lvl="0">
	<subsec ssn="a">
		<item>with</item>
		<item>a little</item>	
		<item>help</item>	
	</subsec>
	<subsec ssn="b">
		<item>from</item>
		<item>my</item>	
		<item>friends</item>
	</subsec>	
</section>
<section lvl="1">
	<subsec ssn="y">
		<item>Ive</item>
		<item>got</item>	
		<item>the</item>
	</subsec>		
	<subsec ssn="z">
		<item>music</item>
		<item>in</item>	
		<item>me</item>
	</subsec>
</section>
</mainxml>


Что я уже пробовал:

//===============================================================
public class LineItem() //----------------------------------
{
	public int WdCtr {get; set;}
	public string Word {get; set;}
} // eo class LineItem -------------------------------------

public class LineList() // ---------------------------------
{
	public List<lineitem> Includes {get; set;}
} // eo class lineList -------------------------------------

void firstQuery() // ------------------------------------------
{
	int ctr = -1;

	var mainList = (from sect in XLineDoc.Descendents("section")
		where sect.Attirbute("lvl").Value=="1" && sect.Element("subSec").Attribute("ssn").Value ="z"			
                  select new LineList
                       {
                          Includes=(from wd in sect.Elements("subSec").Element("item") 
                                select new LineItem
				{
				 WdCtr=ctr++,
				 Word = wd.Value
				}).ToList()        
					                                          
			}).ToList();

} // eo firstQuery ----------------------------------------------</lineitem>

1 Ответов

Рейтинг:
6

Richard Deeming

Предполагая, что вам нужны только подразделы с совпадением ssn, что-то вроде этого должно сработать:

from sect in XLineDoc.Descendants("section")
where (int?)sect.Attribute("lvl") == 1
let list = new LineList
{
    Includes = (from ss in sect.Elements("subSec")
                where (string)ss.Attribute("ssn") == "z"
                from wd in ss.Elements("item")
                select new LineItem
                {
                    WdCtr = ctr++,
                    Word = wd.Value
                }).ToList()
}
where list.Includes.Count != 0
select list;