Только получите определенные столбцы

Можно использовать комбинацию LINQ и XPathNavigator для извлечения расширений синдикации объекта канала (на основе URI пространства имен расширения). Для корпусов объекта Вы захотите исследовать набор ссылок на элемент на ссылки, которые имеют RelationshipType корпус .

Пример:

HttpWebRequest webRequest   = WebRequest.Create("http://www.pwop.com/feed.aspx?show=dotnetrocks&filetype=master") as HttpWebRequest;

using (Stream stream = webRequest.GetResponse().GetResponseStream())
{
    XmlReaderSettings settings  = new XmlReaderSettings();
    settings.IgnoreComments     = true;
    settings.IgnoreWhitespace   = true;

    using(XmlReader reader = XmlReader.Create(stream, settings))
    {
        SyndicationFeed feed    = SyndicationFeed.Load(reader);

        foreach(SyndicationItem item in feed.Items)
        {
            // Get values of syndication extension elements for a given namespace
            string extensionNamespaceUri            = "http://www.itunes.com/dtds/podcast-1.0.dtd";
            SyndicationElementExtension extension   = item.ElementExtensions.Where<SyndicationElementExtension>(x => x.OuterNamespace == extensionNamespaceUri).FirstOrDefault();
            XPathNavigator dataNavigator            = new XPathDocument(extension.GetReader()).CreateNavigator();

            XmlNamespaceManager resolver    = new XmlNamespaceManager(dataNavigator.NameTable);
            resolver.AddNamespace("itunes", extensionNamespaceUri);

            XPathNavigator authorNavigator      = dataNavigator.SelectSingleNode("itunes:author", resolver);
            XPathNavigator subtitleNavigator    = dataNavigator.SelectSingleNode("itunes:subtitle", resolver);
            XPathNavigator summaryNavigator     = dataNavigator.SelectSingleNode("itunes:summary", resolver);
            XPathNavigator durationNavigator    = dataNavigator.SelectSingleNode("itunes:duration", resolver);

            string author   = authorNavigator != null ? authorNavigator.Value : String.Empty;
            string subtitle = subtitleNavigator != null ? subtitleNavigator.Value : String.Empty;
            string summary  = summaryNavigator != null ? summaryNavigator.Value : String.Empty;
            string duration = durationNavigator != null ? durationNavigator.Value : String.Empty;

            // Get attributes of <enclosure> element
            foreach (SyndicationLink enclosure in item.Links.Where<SyndicationLink>(x => x.RelationshipType == "enclosure"))
            {
                Uri url             = enclosure.Uri;
                long length         = enclosure.Length;
                string mediaType    = enclosure.MediaType;
            }
        }
    }
}
40
задан Uwe Keim 30 January 2017 в 09:25
поделиться

1 ответ

Конечно. Проекция делает следующее:

var q = from r in Context.TableName
        select new 
        {
            Id = r.Id,
            Status = r.Status
        }

Вот реальный пример (очевидно, что моя БД имеет другие таблицы, чем ваша). Я добавил свою модель EF в LINQPad и набрал следующий запрос:

from at in AddressTypes
select new
{
    Id = at.Id,
    Code = at.Code
}

LINQPad показывает мне, что сгенерированный SQL:

SELECT 
    1 AS [C1], 
    [Extent1].[AddressTypeId] AS [AddressTypeId], 
    [Extent1].[Code] AS [Code]
FROM 
    [dbo].[AddressType] AS [Extent1]

Никакие другие поля из таблицы не включены.

Ответ на обновленный вопрос

Ваш столбцы аргумент говорит, что он принимает тип T и возвращает тот же тип. Следовательно, переданное вами выражение должно соответствовать этому, или вам нужно изменить тип аргумента, например:

public IEnumerable<U> GetBy<U>(Expression<Func<T, bool>> exp, Expression<Func<T, U>> columns)
{
    return Table.Where<T>(exp).Select<T, U>(columns);
}

Теперь выражение может возвращать любой тип, который вы хотите использовать.

54
ответ дан 27 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: