gpt4 book ai didi

c# - 从 DbContext Set() 中过滤掉软删除

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:24 24 4
gpt4 key购买 nike

如何从此 DbSet 中过滤出 IsSoftDeleted 项?

var type = GetTypeFromString("Whatever");
var whatevers = Set(type);

方法

public dynamic Set(Type type)
{
var set = dbContext.Set(type);
return set;
}

模型

public class Whatever : BaseEntity
{
public virtual string Name { get; set; }
}
public class BaseEntity
{
public virtual int Id { get; set; }
public virtual bool? IsSoftDeleted { get; set; }
}

编辑:忘记显示 Whatever 派生自 BaseEntity

最佳答案

您的 Whatever 类没有任何 IsSoftDeleted 属性,因此没有可过滤的内容。我将假定 Whatever 派生自 BaseEntity。

主要问题是 IQueryable .Where 实际上并不存在:它是一种扩展方法,而扩展方法不适用于动态类型。如果编译器可以看到类型实现 IQueryable ,您可以键入 var.Where(...) 并让编译器将其解析为 System.Linq.Queryable.Where(var, ...)。由于您的示例中的类型是动态的,编译器不知道它实现了 IQueryable,并且会在您尝试调用 Where 时报告错误。

您可以将 DbSet 转换为 IQueryable (只要 Type 具有 BaseEntity 作为基类),并对其调用任何过滤器。你真的使用动态类型功能吗?如果没有,您还可以考虑放弃自定义 Set 函数,并使用默认的 DbContext.Set 函数。

var query = (from e in (IQueryable<BaseEntity>)dbContext.Set(type)
where e.IsSoftDeleted != true
select e);

注意:这与使用 dbContext.Set(type).Cast () 相同:那是行不通的,因为 DbSet 和 DbSet 不兼容。只有使用 IQueryable 和其他带有“out”类型参数的接口(interface),您才能做到这一点。

关于c# - 从 DbContext Set() 中过滤掉软删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8407961/

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