我正在使用 WCF 数据服务/Odata 客户端库,如果我以http://services.odata.org/Northwind/Northwind.svc/上的 Northwind 示例 OData 存储为目标,使用以下说明我可以检索产品数量大于 50:
var r = context.Products.Where(w=> w.UnitsInStock > 50)
我的问题是,假设我想要一个必须执行此操作的通用类,而不是硬编码要检索的实体(在这种情况下为产品)和同一实体的条件(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 生成器在使用函数过滤实体时似乎有困难,所以我必须进一步研究替代方案。欢迎提出建议
更新 2: 可以使用反射检索实体字符串名称:
string s = ((global::System.Data.Services.Common.EntitySetAttribute)(typeof(Product).GetCustomAttributes(typeof(global::System.Data.Services.Common.EntitySetAttribute), true)[0])).EntitySet;
如果还有其他更推荐的方法,请分享。
我仍在寻找一种方法来动态地提供从服务中检索实体的条件。