C# 使用实体框架转换为IQueryable时为空值
我正在使用EF5,我有一个带有GetById方法的通用存储库,它可以接收所需的include属性,如下所示:C# 使用实体框架转换为IQueryable时为空值,c#,linq,entity-framework,linq-to-entities,entity-framework-5,C#,Linq,Entity Framework,Linq To Entities,Entity Framework 5,我正在使用EF5,我有一个带有GetById方法的通用存储库,它可以接收所需的include属性,如下所示: public virtual T GetByIdIncluding(long id, params Expression<Func<T, object>>[] includeProperties) { IQueryable <T> query = DbContext.Set<T>().Find(id) as IQueryable&
public virtual T GetByIdIncluding(long id, params Expression<Func<T, object>>[] includeProperties)
{
IQueryable <T> query = DbContext.Set<T>().Find(id) as IQueryable<T>;
foreach (var includeProperty in includeProperties)
{
query = query.Include(includeProperty);
}
return query.FirstOrDefault();
}
提前谢谢!GuillermoDbContext.Set.Findid返回单个实体
IQueryable是一个DbContext.Set
在按id选择单个实体后,不能包含某些属性。此外,在包含某些属性后,也不能使用DbSet.Find,因为结果将是可查询的。您可以做什么-稍后按id包括属性和筛选结果:
public static IQueryable<T> Including(
params Expression<Func<T, object>>[] includeProperties)
{
IQueryable<T> query = DbContext.Set<T>();
foreach (var includeProperty in includeProperties)
query = query.Include(includeProperty);
return query;
}
此外,您还可以创建方法GetById,该方法包含在具体的存储库类中,而不是在通用存储库中:
public static Foo GetByIdIncluding(long id,
params Expression<Func<Foo, object>>[] includeProperties)
{
return Including(includeProperties).SingleOrDefault(f => f.Id == id);
}
考虑使用惰性加载,默认情况下启用。dBSET。find方法返回一个实体,而不是实体的可查询。在调用Find方法之前,请尝试在集合上设置Include。您需要在循环之后将Find移动到:
public virtual T GetByIdIncluding(long id, params Expression<Func<T, object>>[] includeProperties)
{
var query = DbContext.Set<T>();
foreach (var includeProperty in includeProperties)
{
query = query.Include(includeProperty);
}
return query.Find(id);
}
如果我使用该代码,它会在foreach语句中的行中抱怨说无法将IQueryable转换为DbSet。如果我用IQueryable替换var,那么foreach是可以的,但是它说在最后一行中找不到符号find。顺便说一句,有没有办法先过滤?因为我不想从数据库中检索包含所有内容的所有实体,所以最终只需使用其中一个。与前面的响应相同…当我将查找移动到最后一行时无法解析符号查找。我知道,这就是我正在尝试解析的内容,但不知道如何解析。感谢您的回答!我唯一不喜欢的是,我需要检索数据库中的所有内容,以便稍后进行筛选,并且只获取一个…使用IQueryable结果,数据库中将进行筛选-只返回一个结果。哦,我明白了…因为运行将被延迟。谢谢回答得好!
public static Foo GetByIdIncluding(long id,
params Expression<Func<Foo, object>>[] includeProperties)
{
return Including(includeProperties).SingleOrDefault(f => f.Id == id);
}
public virtual T GetByIdIncluding(long id, params Expression<Func<T, object>>[] includeProperties)
{
var query = DbContext.Set<T>();
foreach (var includeProperty in includeProperties)
{
query = query.Include(includeProperty);
}
return query.Find(id);
}