LINQ подзапрос с оператором AND не показывает результатов - PullRequest
3 голосов
/ 11 февраля 2009

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

        <item>      
            <title>Industries</title>      
            <category type="Channel">Automotive</category>      
            <category type="Type">Cars</category>      
            <category type="Token">Article</category>      
            <category type="SpecialToken">News</category>      
            <guid>637f0dd7-57a0-4001-8272-f0fba60feba1</guid>
        </item>

В SQL я бы написал что-то вроде.

select * from articles where channel = 'Automative' AND type = 'Cars' etc. etc.

Как мне добиться этого с помощью linq? Я попытался следующий запрос, но он возвращает ноль. Если я объединю два атрибута с «ИЛИ» || Оператор Я получил бы результаты, но со всеми двойными результатами, если элемент соответствует обоим критериям.

var articleList = (from item in doc.Descendants("item")

                         from _category in item.Elements("category")
                         where _category.Value == valueCboChannel && _category.Attribute("domain").Value == "Channel"
                         && (_category.Value == valueCboSubChannel && _category.Attribute("domain").Value == "SubChannel")

                         select new
                         {

                             Title = item.Element("title").Value,
                             Guid= item.Element("guid").Value,
                             description = item.Element("description").Value,
                             link = item.Element("link").Value
                         }).ToList();

            ListView1.DataSource = articleList;
            ListView1.DataBind();               

Ответы [ 2 ]

3 голосов
/ 11 февраля 2009

Я бы упростил это с помощью метода расширения, чтобы сделать хитрый поиск:

(обновлено 02.12.09 для исключения пустых элементов)

static string CategoryValue(this XElement element, string type)
{
    var category = element.Elements("category").FirstOrDefault(
        c => (string)c.Attribute("type") == type
            && !string.IsNullOrEmpty(c.Value)); // UPDATE HERE
    return category == null ? null : category.Value;
}

static void Main()
{
    XDocument doc = XDocument.Parse(xml);
    var qry = from item in doc.Descendants("item")
              where item.CategoryValue("Channel") == "Automotive"
              && item.CategoryValue("Type") == "Cars"
              select item;
    foreach (var node in qry)
    {
        Console.WriteLine(node.Element("guid").Value);
    }
}
0 голосов
/ 12 февраля 2009

Спасибо за совет, мне удалось как-то заставить его работать, но только с ".First" в методе расширения.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, как получить все значения там, где в XML-файле есть значения NULL. В принципе, XML может выглядеть следующим образом. Так что, если я использую «Первый», то, конечно, будет выбран первый пустой, поэтому не отображается. Есть ли способ пропустить значения NULL?

<item>
    <title>Industries</title>
    <category type="Channel"></category> 
    <category type="Channel">Automotive</category> 
    <category type="Type"></category>     
    <category type="Type">Cars</category>     
    <category type="Token">Article</category>       
    <category type="SpecialToken">News</category>       
    <guid>637f0dd7-57a0-4001-8272-f0fba60feba1</guid>  
</item>

Здесь текущий метод расширения

    public static string CategoryValue(this XElement item, string type)
    {
        var category = item.Descendants("category").First(c => (string)c.Attribute("type") == type);
        return category == null ? null : category.Value;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...