我有一个定义如下的接口:
public interface IEntityUnitOfWork : IEntityModelUnitOfWork, IDisposable
{
IQueryable<T> IncludeProperties<T>(IQueryable<T> theQueryable, params Func<T, object>[] toInclude)
where T : class, new();
}
...这使我能够编写如下代码:
var foo = MyUnitOfWork.IncludeProperties(
MyUnitOfWork.MyQueryable,
p=>p.MyProperty1,
p=>p.MyProperty2,
...
p=>p.MyPropertyN);
在实现上添加一些技巧,这个工作得相当不错。但是它看起来有点别扭。我认为我应该能够更加简洁地编写它,以便可以使用这种格式:
var foo = MyUnitOfWork.Fetch(
f=>f.MyQueryable,
p=>p.MyProperty1,
p=>p.MyProperty2,
...
p=>p.MyPropertyN);
因此,我编写了一个如下所示的扩展方法:
public static IQueryable<T> Fetch<T>(
this IEntityUnitOfWork unitOfWork,
Func<IEntityUnitOfWork, IQueryable<T>> queryable,
params Func<T, object>[] toInclude) where T:class, new()
{
var q = queryable.Target as IQueryable<T>;
foreach (var p in toInclude)
{
q = unitOfWork.IncludeProperties(q, new[] { p });
}
return q ;
}
这个建立过程很顺利,而且Intellisense也是我所期望的工作,但是当我试图使用它时,它却失败了,并显示了一个 NullReferenceException
。 我假设 queryable.Target
应该是我想引用的IQueryable<T>
,但它似乎不是我所预想的东西,而在我的Intellisense / Quickwatch选项中没有其他明显的选择。
我该如何将那个q
值设置为我想要在以下语句中引用的IEntityUnitOfWork
的IQueryable<T>
属性?
queryable(unitOfWork)
。您可能还想重新命名该参数:它不再是一个可查询的对象。 - user743382IQueryable<T> theQueryable
,在这种情况下,它确实是可查询的。当你有Func<..., IQueryable<T>>
时,你没有一个可查询的对象,而是一个函数,当调用时返回一个可查询的对象。 - user743382