gpt4 book ai didi

c# - 按类型继承使用表时返回实体类型

转载 作者:太空狗 更新时间:2023-10-29 20:37:13 25 4
gpt4 key购买 nike

假设我有以下实体

public abstract class Animal
{
public int Id {get;set;}
}

public class Cat : Animal
{
}

public class Dog : Animal
{
}

是否可以在不创建实例的情况下确定实体的类型。

var id = 1;
var type = context.Animals.GetTypeOfAnimal(id)

public static Type GetTypeOfAnimal(this ObjectSet<Animal> source, int id)
{
// What shall I do here, I dont want to fetch the instance at this point...
var animal = source.First(a => a.Id == id);
return animal.GetType();
}

我想到的一个解决方法是使用下面的方法...

public static Type GetTypeOfAnimal(this ObjectSet<Animal> source, int id)  
{
var info = source.Where(a => a.Id == id).Select(a => new {IsDog = a is Dog, IsCat = a is Cat}).First();

if(info.IsDog) return typeof(Dog);
if(info.IdCat) return typeof(Cat);

return null;
}

最佳答案

如果不查询数据库,就无法获取此信息。您正在使用 TPT——这意味着数据库包含 Animal、Dog 和 Cat 表。数据库中的继承是通过 Animal 和 Dog 之间以及 Animal 和 Cat 之间的一对一关系建模的。您至少需要为该 Id 查询 Animal 和 Dog 表(它只能存在于其中一个表中)。第一个问题是您不能直接使用 EF 查询这些表,因为 EF 只能处理整个实体(而不仅仅是映射到单个表的部分)——您必须使用直接 SQL。第二个问题是这个解决方案的脆弱性。如果您添加新的派生实体,则必须修复此查询(您的示例也是如此)。

TPT 查询缓慢的原因是 EF 必须查询所有继承树 = 在您的情况下 Animal 加入 DogAnimal 连接加入了 Cat。 .NET 4.5 在查询 TPT 继承树方面有一些性能改进,但它不会影响您的查询,因为它只需要查询整个结构。

关于c# - 按类型继承使用表时返回实体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com