C# 使用实体框架转换为IQueryable时为空值

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&

我正在使用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<T>;

    foreach (var includeProperty in includeProperties)
    {
        query = query.Include(includeProperty);
    }

    return query.FirstOrDefault();
}
提前谢谢!Guillermo

DbContext.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);
}