gpt4 book ai didi

c# - .NET LINQ to Entities 泛型类型的基础 where 子句

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

我正在使用 Entity Framework 访问我的领域模型,所有领域模型都实现了一个接口(interface) (IPublishable),该接口(interface)指定属性以指示项目是否已发布。

从前端访问项目时,我总是想过滤掉未发布的项目。因此,每次我编写查询时,我都会做类似的事情(其中以下 DbSets Objects1 和 Objects2 都实现了 IPublishable

context.Objects1.Where( x => x.IsPublished ...).OrderBy( x => x.Id).ToList()
context.Objects2.Where( x => x.IsPublished ...).First()

理想的情况是,如果我可以将通用的 Where() 子句注入(inject)到我的网络应用程序中的所有查询中,或者如果有一种方法可以编写一个扩展方法,我可以将其包含在每个查询中查询。

我尝试为所有 linq 查询创建扩展方法

public static IEnumerable<T> FrontEnd<T>(this DbSet<T> dbSet) where T : class {
return dbSet.Cast<IPublishable>().Where( x => x.IsPublished ...).Cast<T>();
}

然后像这样使用...

context.Objects1.FrontEnd().Where( x => ...).OrderBy(...

但是我收到错误消息“LINQ to Entities 仅支持转换 EDM 原语或枚举类型”

我是 EF 的新手,所以任何信息都会有很大帮助。谢谢

最佳答案

根据评论更新 - 这行得通

public static IQueryable<T> FrontEnd<T>(this DbSet<T> dbSet)
where T : class, IPublishable
{
return dbSet.Where(x => x.IsPublished);
}

可以这样使用:

context.Objects1.FrontEnd().Where( x => ...).OrderBy(...

您可以尝试以下任一选项:

public static IQueryable<dynamic> FrontEnd(this DbSet<dynamic> dbSet)
{
return dbSet.Where(x => (x as IPublishable).IsPublished);
}

public static IQueryable<T> FrontEnd<T>(this DbSet<T> dbSet)
where T : class, IPublishable
{
return dbSet.Where(x => x.IsPublished);
}

注意:

第一个选项使用动态,所以速度较慢使用第二个选项,您必须在调用 FrontEnd() 时指定类型例如

context.Objects1.FrontEnd<Objects1>().Where( x => ...).OrderBy(...

关于c# - .NET LINQ to Entities 泛型类型的基础 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17490125/

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