Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取特定类型的记录_C#_Types_Visual Studio 2013_Poco_Entity Framework 6 - Fatal编程技术网

C# 获取特定类型的记录

C# 获取特定类型的记录,c#,types,visual-studio-2013,poco,entity-framework-6,C#,Types,Visual Studio 2013,Poco,Entity Framework 6,我有两门课: public class BaseItem { public Guid Id { get; set; } public string Name { get; set; } public virtual List<ChildItem> Children { get; set; } } public class ChildItem : BaseItem { public virtual BaseItem Parent { get; set;

我有两门课:

public class BaseItem
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual List<ChildItem> Children { get; set; }
}
public class ChildItem : BaseItem
{
    public virtual BaseItem Parent { get; set; }
    public ChildItem() { }
}
这将不起作用,因为EF无法将GetType方法转换为对数据库有意义的方法。因此,我要么在Where子句前面放一个
.ToList()
,要么找到更好的解决方案。
因为我不想在筛选出500个根项目之前检索所有1000000条记录,所以我需要更好的解决方案。更好的解决方案是什么

这就是DBContext(db变量)和DBSet(db的Items属性)的定义方式

 public class Datamodel : DbContext
    {
        public Datamodel() : base("name=Datamodel") { }
        public virtual DbSet<BaseItem> Items { get; set; }
        public virtual DbSet<ChildItem> Children { get; set; }
    }
公共类数据模型:DbContext
{
public Datamodel():base(“name=Datamodel”){}
公共虚拟数据库集项{get;set;}
公共虚拟数据库集子项{get;set;}
}

由于涉及继承,可能有一个类型描述符,用于对存储的实体进行筛选,它似乎只有一个表,您有一个称为“每个层次表”(TPH)的安排

请查看此链接:

它指的是一种类型为()的
方法,可以满足您的要求

编辑(更正为工作示例)

使用类似以下的用法:

var rootItems = context.Items.OfType<BaseItem>().Except(context.Items.OfType<ChildItem>());

我通过向每个类添加类似于
[Table(“Items”,Schema=“Datamodel”)]
的内容来创建单独的表。所以,这不是一个真正的问题,尽管我必须决定我喜欢什么。。。没什么区别。已经发现了如何移动到TPT,但问题仍然存在,我不想选择所有基本项。只有根项目。OfType仍然会产生all,因为从技术上讲,它们都是BaseItem类型。(继承与否)抓住你了!我有点困惑,为什么不能只查询Items集合(所有根的集合)?您的DBSet看起来像什么?我在上面添加了DBContext和DBSet定义。问题是数据库中可能有很多记录。Items将返回BaseItem和ChildItem记录,而我只需要BaseItem记录。事情变得更加复杂,因为我有更多的类/表继承自BaseItem或ChildItem。通过一个简单的案例,完成并确认仅检索根项。我认为它可能会缩短为
context.items.Except(context.items.OfType())因为它们都是BaseItem类。(测试:是的,它工作!)最棒的是,它选择所有根项目,即,从BaseItem派生的任何项目,但不选择ChildItem。这正是我需要的。
var rootItems = context.Items.OfType<BaseItem>().Except(context.Items.OfType<ChildItem>());
SELECT 
1 AS [C1], 
[Except1].[Discriminator] AS [C2], 
[Except1].[Id] AS [C3], 
[Except1].[Name] AS [C4], 
[Except1].[Parent_Id] AS [C5]
FROM  (SELECT 
    [Extent1].[Discriminator] AS [Discriminator], 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Parent_Id] AS [Parent_Id]
    FROM [dbo].[BaseItems] AS [Extent1]
WHERE [Extent1].[Discriminator] IN (N'ChildItem',N'BaseItem')
EXCEPT
    SELECT 
    N'ChildItem' AS [C1], 
    [Extent2].[Id] AS [Id], 
    [Extent2].[Name] AS [Name], 
    [Extent2].[Parent_Id] AS [Parent_Id]
    FROM [dbo].[BaseItems] AS [Extent2]
    WHERE [Extent2].[Discriminator] = N'ChildItem') AS [Except1]}