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

C# 如何使用Linq to实体动态检索特定子类型的所有记录?,c#,linq,entity-framework,inheritance,linq-to-entities,C#,Linq,Entity Framework,Inheritance,Linq To Entities,我正在尝试获取数据库中指定类型的所有对象的列表。我以前在编译时知道类型时就这样做了,但现在我试图将一个类型传递到方法中,让方法返回该指定类型的所有记录,但我无法让它工作。我尝试了以下方法: public IList<WritingObject> GetBasicObjectsByProject(int projectId, Type oType) { var results = from o in _objects.AsQueryable

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

    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>();
    }
这不起作用,因为编译器声明oType不是已知类型。使用
typeof(oType)
会产生与在
IQueryable
上执行
OfType()
相同的错误

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

比如:

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();
var query=from\u objects.AsQueryable()中的o
其中o.Project.Id==projectId
选择o;
var of type=typeof(Queryable).GetMethod(“of type”).MakeGenericMethod(oType);
var list=(IQueryable)of type.Invoke(
null,新对象[]{query}).Cast().ToList();

注意,这也将包括其他子类型。

我认为这里的问题是LINQtoEntities正在尝试将
o.GetType
转换为SQL,但它显然不能。在重新阅读了这个问题之后,我意识到这与linq to实体无法将CLR类型映射到数据库类型有关。谈到这一点:

LINQ标准查询运算符 处理CLR类型转换和 实体中支持测试 框架仅映射到的CLR类型 支持概念模型类型 在LINQ中创建实体。有关 概念模型类型,请参见

上述情况意味着,作为查询生成的一部分,它只能将少数受支持的CLR类型转换为适当的EDM类型。如果您尝试使用的类型不在该列表中,则需要在检索查询结果后按类型进行筛选

此问题的解决方案可能效率低下-您需要请求与
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>();
var results=(来自_objects.AsQueryable中的o)
其中o.Project.Id==projectId
选择o.ToList()//在此强制执行查询
结果=从结果中的o开始
其中o.GetType()==oType
选择o;
返回结果。ToList();

您使用什么代码来指定硬编码类型?
WritingObject
是否映射到数据库中的记录或字段?手动映射到类型(其中WritingObject是对象类型)时,我使用
where o is WritingObject
,并且可以正常工作。WritingObject是一个数据库表(和一个C#类),它具有从中继承的各种表和类
    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>();