На самом деле я сделал, и вот хитрость:)
Я добавил « Ссылка на услугу » к моей службе WCF, выставив ADO.NET Entity Framework *Модель 1006 *.Проблема заключается в том, что в приложении XAML / C # Metro выполнить следующий код не удается:
SampleEntities ctx = ((App)Application.Current).Context;
var query = from p in ctx.Products
where p.Name == name
select p;
foreach (Product p in query) /** this line fails **/
{
// do stuff
}
Вот исключение, которое вы получите во время выполнения:
"Silverlight неПозволяет вам напрямую перечислять запрос службы данных. Это происходит потому, что перечисление автоматически отправляет синхронный запрос в службу данных. Поскольку Silverlight поддерживает только асинхронные операции, вы должны вместо этого вызвать методы BeginExecute и EndExecute, чтобы получить результат запроса, который поддерживает перечисление."} [System.NotSupportedException]: {" Silverlight не позволяет напрямую перечислять запрос службы данных. Это происходит потому, что перечисление автоматически отправляет синхронный запрос в службу данных. Поскольку Silverlight поддерживает только асинхронные операции, вместо этого необходимо вызватьМетоды BeginExecute и EndExecute для получения результата запроса, который поддерживает перечисление. "
Ах, это было бы слишком хорошо, чтобы быть правдой!
Как указано в исключении, вычтобы ваши серверные вызовы были асинхронными, как в Silverlight.
Вот пример того, как вы можете использовать службу RIA WCF в приложении C # Metro, делая это old school способом:
(...)
var query = from p in ctx.Products
where p.Name == Name
select p;
((DataServiceQuery<Product>)query).BeginExecute(OnLoadItemsCompleted, query);
(...)
private void OnLoadItemsCompleted(IAsyncResult result)
{
var query = result.AsyncState as DataServiceQuery<Product>;
IEnumerable<Product> response = query.EndExecute(result);
foreach (Product o in response)
{
// Do stuff
}
}
Теперь, используя .NET 4.5 и его новые await & async ключевые слова, вы можете получить то же самоерезультат, не допуская разбивки вашего кода на все эти маленькие методы обратного вызова.
Пример:
async void GetProducts()
{
SampleEntities ctx = ((App)Application.Current).Context;
var query = from p in ctx.Products
where p.Name == name
select p;
DataServiceQuery<Product> dqs = (DataServiceQuery<Product>)(query);
TaskFactory<IEnumerable<Product>> tf = new TaskFactory<IEnumerable<Product>>();
myListView.ItemsSource = await tf.FromAsync(dqs.BeginExecute(null, null),
iar => dqs.EndExecute(iar));
}
Использование любого из двух последних методов работало хорошо для меня:)