我首先使用实体框架代码来对抗Oracle数据库。我们的几个实体中都有字节数组(blob)。有时我想要blob,有时我不想。我希望有一个简单干净的方法来获取IQueryable<T>
并取消选择blob列,同时将其强类型保存为IQueryable<T>
。
给定IQueryable<T>
我想取消选择指定的属性。我正在梦想一种扩展方法,其签名类似于以下内容:
public static IQueryable<T> Deselect<T>(this IQueryable<T> source, PropertyInfo deselectedProperty)
{
// re-project the queryable without the specified property
}
public static IQueryable<T> Deselect<T>(this IQueryable<T> source, Expression<Func<T, object>> selector)
{
// re-project the queryable without property specified in selector
}
这可能吗?我正在考虑某种表达式访问者来查找数据的最新投影,复制并重新投影数据而不指定属性/列。我尝试将投影硬编码到相同的类型,但是实体框架引发了一个异常,说我无法为映射类型调用构造函数,并且我真的希望能够在可能的情况下维护我的返回类型。我知道我可以通过选择没有属性的新匿名类型来执行取消选择,但是除非我强制评估可查询,否则我无法返回我的实体类型。
所需的用法如下:
interface IHaveBlob
{
byte[] Blob { get; set; }
}
class ComplexType : IHaveBlob
{
public long ID { get; set; }
public string Description { get; set; }
public byte[] Blob { get; set; }
}
public void DeselectBlob<T>(IQueryable<T> source) where T : IHaveBlob
{
return source.Deselect(x => x.Blob);
}