gpt4 book ai didi

c# - LINQ-to-sql 抽象类中的映射表达式

转载 作者:可可西里 更新时间:2023-11-01 08:49:35 24 4
gpt4 key购买 nike

我有一个由两个类继承的抽象类。这两个类都代表数据库中的表。尽管在抽象类中,我在映射表达式时遇到了麻烦,因此我不断收到无法将其转换为 SQL 的异常。我在 Stackoverflow 中发现的所有问题都在谈论已经为我工作的列。

下面是一段非常简单的代码,说明了我的意思。 Car 和 Motorcycle 具有完全独立的 _isNew Expression 实现。

public abstract class Vehicle  {
public abstract boolean IsNew;
}

public partial class Car: Vehicle {
public override boolean IsNew {
get { _isNew.Invoke(this); }
}
}
public partial class Motorcycle: Vehicle {
public override boolean IsNew {
get { _isNew.Invoke(this); }
}
}

我希望能够在 IQueryable 上调用 _isNew 表达式或 IsNew 属性,但它运行 Car 类的 _isNew 以防 Vehicle 是 Car 类型。无论如何我可以做到这一点吗?我尝试过的所有解决方案都导致无法将其转换为 SQL 的异常。

最佳答案

在我回答你的问题之前,你应该检查一下 best practices of C# properties concerning exceptions .

您可以直接加载您的列表,然后调用您的 IsNew 属性,这将消除 Linq-to-SQL 错误。但我知道,如果您依赖 IsNew 过滤其中的大量数据,这可能会导致性能问题。

我认为您的问题实际上是由于您想使用车辆的实例 来获取“IsNew”属性。但是您根本不能这样做,因为 linq-to-sql 会合理地提示 when you are trying to use a property that is not mapped to a column .

因此,如果您不能使用实例,下一个最好的方法是什么?

也许我会选择静态表达式

public partial class Motorcycle : Vehicle
{
public static Expression<Func<Vehicle, bool>> IsNew { get { return (v) => v.Age <= 1; } }
}

public partial class Car : Vehicle
{
public static Expression<Func<Vehicle, bool>> IsNew { get { return (v) => v.Age <= 2; } }
}

你可以像这样使用

var newCars = db.Cars.Where(Car.IsNew).ToList();
var newMotorcycles = db.Motorcycles.Where(Motorcycle.IsNew).ToList();

或者您可以将逻辑拉到您的应用程序并在SQL Server 中作为computed column 执行它,我个人认为这是您的最佳选择。

关于c# - LINQ-to-sql 抽象类中的映射表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37621189/

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