gpt4 book ai didi

c# - 如何使用通用存储库模式按类型有条件地过滤 IQueryable

转载 作者:行者123 更新时间:2023-11-30 15:31:52 25 4
gpt4 key购买 nike

我的通用存储库中有一个方法返回 IQueryable<T> :

    public virtual IQueryable<T> All
{
get
{
DbSet<T> set = Context.Set<T>();

if (typeof(T).IsSubclassOf(typeof(OrganisationDependent)))
return set.AsEnumerable()
.Cast<OrganisationDependent>()
.Where(x => x.OrganisationID == CurrentOrganisationID)
.AsQueryable()
.Cast<T>();

return set;
}
}

使用 if 语句的原因是大多数但不是我的所有表都有 OrganisationID我想确保用户只能看到他们所属组织的数据。上面的代码有效,但为了使其有效,我必须添加 AsEnumerable()将数据拉入内存。没有它我会收到错误消息

"Unable to cast the type 'Models.xxx' to type 'Models.OrganisationDependent'. LINQ to Entities only supports casting EDM primitive or enumeration types"

我所有的实体都直接继承了 ModelBaseOrganisationDependent :

public abstract class OrganisationDependent : ModelBase
{
public int OrganisationID { get; set; }

public virtual Organisation Organisation { get; set; }
}

public abstract class ModelBase
{
public int ID { get; set; }
}

有没有一种方法可以克服这个限制,以便当类型是 OrganisationDependent 的子类时? , 我过滤 OrganisationID无需将查询拉入内存?

最佳答案

最简单的选择可能是使用 LINQ 表达式 API 动态构建过滤器表达式:

private static readonly PropertyInfo _organizationIdProperty 
= typeof(OrganisationDependent).GetProperty("OrganisationID");

private static Expression<Func<T, bool>> FilterByOrganization<T>(int organizationId)
{
var item = Expression.Parameter(typeof(T), "item");
var propertyValue = Expression.Property(item, _organizationIdProperty);
var body = Expression.Equal(propertyValue, Expression.Constant(organizationId));
return Expression.Lambda<Func<T, bool>>(body, item);
}

public virtual IQueryable<T> All
{
get
{
IQueryable<T> set = Context.Set<T>();
if (typeof(T).IsSubclassOf(typeof(OrganisationDependent)))
{
var filter = FilterByOrganization<T>(CurrentOrganisationID);
set = set.Where(filter);
}

return set;
}
}

关于c# - 如何使用通用存储库模式按类型有条件地过滤 IQueryable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20052827/

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