Можно использовать комбинацию 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;
}
}
}
}
Конечно. Проекция делает следующее:
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);
}
Теперь выражение может возвращать любой тип, который вы хотите использовать.