从IQueryable linq实体框架中取消选择列

时间:2013-12-24 11:35:55

标签: c# linq entity-framework expression iqueryable

我首先使用实体​​框架代码来对抗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);
}

0 个答案:

没有答案