|
using System;
using System.Net;
using System.Linq;
using System.Xml.Linq;
using System.Collections.ObjectModel;
using System.Threading;
using System.Threading.Tasks;
namespace Patterns.AMB
{
public class NetflixQuery<T> where T : NetflixEntity, new()
{
#region Members
WebClient client;
#endregion
#region ctor
public NetflixQuery(string query)
{
client = new WebClient();
Query = query;
Entities = new ObservableCollection<T>();
EntitiesExpected = null;
}
#endregion
#region Properties
public string Query { get; private set; }
public ObservableCollection<T> Entities { get; private set; }
public int? EntitiesExpected { get; private set; }
#endregion
#region Methods
public async Task FetchEntitiesAsync(CancellationToken cancel)
{
using (var cancelReg = cancel.Register(client.CancelAsync))
{
string next = Query;
while (next != null)
{
var result = XDocument.Parse(await client.DownloadStringTaskAsync(new Uri(next)));
var countElement = result.Descendants(ODataXML.mName("count"))
.SingleOrDefault() as XElement;
if (countElement != null)
{
int itemsTotal = int.Parse(countElement.Value);
EntitiesExpected = itemsTotal;
}
var entries = result.Descendants(ODataXML.Name("entry"));
foreach (var entry in entries)
{
T entity = new T();
entity.LoadFromXML(entry);
Entities.Add(entity);
}
next = GetNextUri(result);
}
EntitiesExpected = Entities.Count;
}
}
#endregion
#region Helper
string GetNextUri(XDocument xml)
{
return (from elem in xml.Element(ODataXML.Name("feed")).Elements(ODataXML.Name("link"))
where elem.Attribute("rel").Value == "next"
select elem.Attribute("href").Value).SingleOrDefault();
}
#endregion
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Florian lives in Munich, Germany. He started his programming career with Perl. After programming C/C++ for some years he discovered his favorite programming language C#. He did work at Siemens as a programmer until he decided to study Physics.
During his studies he worked as an IT consultant for various companies. After graduating with a PhD in theoretical particle Physics he is working as a senior technical consultant in the field of home automation and IoT.
Florian has been giving lectures in C#, HTML5 with CSS3 and JavaScript, software design, and other topics. He is regularly giving talks at user groups, conferences, and companies. He is actively contributing to open-source projects. Florian is the maintainer of AngleSharp, a completely managed browser engine.