Клиент служб данных WCF: Как выбрать подходящие объекты на основе предоставленного универсального типа T и Func?
Я использую клиентскую библиотеку WCF Data Services/Odata, и если я выберу образец хранилища OData Northwind по адресу http://services.odata.org/Northwind/Northwind.svc/, с помощью следующей инструкции я смогу получить продукты, которые иметь количество больше 50:
var r = context.Products.Where(w=> w.UnitsInStock > 50)
У меня вопрос: предположим, что я хочу иметь универсальный класс, который должен выполнять эту операцию, но вместо жесткого кодирования объекта для извлечения (в данном случае Products) и условия над той же сущностью (UnitsInStock > 50) я бы хотел предоставить объект / имя объекта и условие как Func. Я хотел бы иметь что-то вроде следующего класса, где мнимая функция GetEntityType будет выводить сущность из предоставленного T, но, к сожалению, GetEntityType не существует, и я не нашел, как выполнить ту же задачу:
public class OdataTesting<T>
{
...
public IQueryable<T> ReturnItem(Func<T, bool> selector)
{
return context.GetEntityType<T>().Where(w=> selector(w));
}
...
}
ОБНОВИТЬ:
Я нашел метод CreateQuery, который можно использовать следующим образом:
return context.CreateQuery<T>("Products").Where(w=> selector(w));
Но...
1. Я не могу найти способ получить строковое имя объекта, связанное с типом данных. Есть ли способ получить это программно от T?
2. Генератор URI, похоже, испытывает трудности, когда функции используются для фильтрации объектов, поэтому мне придется дополнительно изучить альтернативы. Sugestions приветствуются
ОБНОВЛЕНИЕ 2: Имя строки объекта можно получить с помощью отражения:
string s = ((global::System.Data.Services.Common.EntitySetAttribute)(typeof(Product).GetCustomAttributes(typeof(global::System.Data.Services.Common.EntitySetAttribute), true)[0])).EntitySet;
Если есть другой, более рекомендуемый способ сделать это, пожалуйста, поделитесь.
Я все еще ищу способ динамически предоставить условие для извлечения сущностей из сервиса.