gpt4 book ai didi

c# - 在代码时不知道目标类型的情况下动态更改表达式中参数的类型

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:25 25 4
gpt4 key购买 nike

假设我有一个 Animal 类,它有一些派生自它的后代,例如 Dog CatMouse

public class Animal{}
public class Dog : Animal {}
public class Cat : Animal {}
public class Mouse: Animal {}

现在假设这些对象的实体存储在 sql 数据库中,并且我使用 Entity Framework 与该数据库进行通信。狗、猫和老鼠都存储在不同的表中,但在代码中,它们共享相同的父代。

如果我想得到满足相同表达式的所有动物,我将不得不分别查询每个 DbSet 并给它相同的表达式但具有不同类型的参数,所以一只猫得到一个猫参数类型,一只狗得到一只狗这样的参数

var cats = context.Cats.Where(p=>some expression);
var dogs= context.Dogs.Where(p=>some expression);
var mice= context.Mice.Where(p=>some expression);
var animals = new List<Animal>();
animals.AddRange(cats);
animals.AddRange(dogs);
animals.AddRange(mice);

但是,这给我带来了问题,因为如果我想添加另一种动物类型,例如 Bird,我将不得不添加另一行代码,从数据库中获取数据并将其添加到结果集合。这种行为很难管理,我希望它循环遍历从 Animal 派生的类型,并根据提供的源表达式以编程方式为适当的类型构造一个表达式,该表达式作为参数传递给方法作为 Animal 类型的表达式。像这样:

public List<Animal> GetAnimals(Expression<Func<Animal, bool>> expression)
{
var animalTypes = GetTypesDerivingFrom(typeof(Animal));
List<Animal> animals = new List<Animal>();
foreach(var animalType in animalTypes)
{
var typeTranslatedExpression = GetTypeTranslatedExpression(expression); //i dont know how to do this part
var portionOfAnimals = context.Set(animalType).Where(typeTranslatedExpression).ToList();
animals.AddRange(portionOfAnimals);
}
return animals;
}

有什么办法吗?我考虑过更改表达式参数类型,但我似乎无法在不知道代码时正确参数类型的情况下弄明白。

最佳答案

我认为你应该再看看你的数据设计。您可以在这里解决很多问题。

您可以使用 SQL SERVER VIEW 从​​相关表中使用 UNION 从不同的表中返回您的动物。添加新的动物表需要在 View 中使用新的 UNION。

您也可以使用存储过程执行相同的操作。我会用一个来获取动物,用一个来保存动物,以确保更新正确的表格。

您可以将所有动物存储在一个表中,并有一个 AnimalType 字段链接到另一个具有 ID 和 AnimalTypeName 的简单表。然后添加新动物很简单。

还有 Entity Framework 继承与表需要考虑 https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

关于c# - 在代码时不知道目标类型的情况下动态更改表达式中参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53703604/

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