代码之家  ›  专栏  ›  技术社区  ›  KallDrexx

如何使用Linq-to实体动态检索特定子类型的所有记录?

  •  4
  • KallDrexx  · 技术社区  · 14 年前

    我正在尝试获取数据库中指定类型的所有对象的列表。我以前在编译时知道类型时就这样做了,但是现在我试图将一个类型传递到方法中,让方法返回指定类型的所有记录,但我无法使它工作。我尝试了以下方法:

        public IList<WritingObject> GetBasicObjectsByProject(int projectId, Type oType)
        {
            var results = from o in _objects.AsQueryable
                          where o.Project.Id == projectId
                          && o.GetType() == oType
                          select o;
    
            return results.ToList<WritingObject>();
        }
    

    这不起作用,因为linqto实体不支持GetType()方法。接下来我试着

            var results = from o in _objects.AsQueryable
                          where o.Project.Id == projectId
                          && o is oType
                          select o;
    

    typeof(oType) 产生与执行相同的错误 OfType<oType>() IQueryable .

    我已经没有办法在不将它拆分为每个子类型的一个方法的情况下保持动态了。有人有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Marc Gravell    14 年前

    比如:?

    var query = from o in _objects.AsQueryable()
                where o.Project.Id == projectId
                select o;
    
    var ofType = typeof (Queryable).GetMethod("OfType").MakeGenericMethod(oType);
    var list = (IQueryable)ofType.Invoke(
                null, new object[] {query}).Cast<WritingObject>().ToList();
    

        2
  •  0
  •   Igor Zevaka    14 年前

    我认为这里的问题是linqto实体正在尝试翻译 o.GetType 很明显,它不能。在重读这个问题之后,我意识到这与linqto实体无法将CLR类型映射到数据库类型有关。 Linq to Entities help 谈到这一点:

    LINQ标准查询运算符 处理CLR类型转换和 框架。仅映射到的CLR类型 支持概念模型类型 在LINQ到实体。一份 概念模型类型,请参见 Conceptual Model Types

    此问题的解决方案可能效率低下—您将需要请求所有匹配的记录 projectId 条件,然后按类型筛选:

        var results = (from o in _objects.AsQueryable
                      where o.Project.Id == projectId
                      select o).ToList(); //force query execution here
    
        results = from o in results 
                  where o.GetType() == oType
                  select o;
    
        return results.ToList<WritingObject>();