DBContext Find with Includes - 其中带有主键的 lambda

2024-02-22

我正在编写一个通用存储库以使用 DBContext 与 EF 交互。

我有一个通用的 Get() 方法,它接收主键值并返回实体:

public class DALRepository<DALEntity> : IDisposable, IGenericRepository<DALEntity> where DALEntity : class
{
private IDbSet<DALEntity> dbSet;
private NWEntities context;

public DALRepository()
{
  context = new NWEntities();
  context.Configuration.LazyLoadingEnabled = false;
  dbSet = context.Set<DALEntity>();
}

这是一个简单的 get 方法 - 仅适用于 PK - 正是我想要的。

public DALEntity Get(string ID)
{
   return dbSet.Find(ID);
}

我现在想更改此设置,以允许消费者传递包含列表 - 因此,除了仅返回客户外,他们还可以请求返回订单。这就是我遇到麻烦的地方。如果我这样做:

public DALEntity Get(string ID, IEnumerable<string> IncludeEntities = null)
{
      IQueryable<DALEntity> query = dbSet;
      query = IncludeEntities.Aggregate(query, (current, includePath) => current.Include(includePath));
}

我无法将 find 与 IQueryable 一起使用。我无法直接 Find() 因为我无法将包含传递给它。如果我在 IQueryable 上使用 where lambda,我如何告诉它使用实体的 PK?我想我可以有一个泛型约束,坚持泛型类型必须实现一些带有明确定义的主列名称(例如“ID”)的 IPkey 接口,但是我不能使用 DBContext 生成的实体,因为它们必须实现这个界面。如果需要,我可以更改 T4 来执行此操作 - 而且我已经将其更改为发出 XML 注释,所以不太反对这样做 - 但有人有更简单的方法吗?我想我需要的是一个重载的 find() ,它接受包含列表。

所以我的问题是如何将 Find 与包含一起使用,或者如何在知道 PK 的地方编写 lambda?我无法接收这样的 lambda 作为参数,因为它最终将由 WCF 服务使用。


回答你自己的问题有点奇怪,但如果其他人也遇到这个问题,这就是我所做的。我使用了动态 LINQ 内容并使用了 .Where() 的字符串重载版本。我使用提到的链接之一来弄清楚如何获取主键(我的也是来自 DBContext),该方法现在如下所示:

public DALEntity Get(string ID, IEnumerable<string> IncludeEntities = null)
{
  var set = ((IObjectContextAdapter)context).ObjectContext.CreateObjectSet<DALEntity>();
  var entitySet = set.EntitySet;
  string[] keyNames = entitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
  Debug.Assert(keyNames.Length == 1, "DAL does not work with composite primary keys or tables without primary keys");

  IQueryable<DALEntity> query = dbSet;
  query = IncludeEntities.Aggregate(query, (current, includePath) => current.Include(includePath));

  query = query.Where(keyNames[0] + "= @0", ID);
  return query.FirstOrDefault();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DBContext Find with Includes - 其中带有主键的 lambda 的相关文章

随机推荐

  • Socket.io 检测客户端何时断开连接

    我正在编写一个应用程序 当用户访问我的站点时 我打开一个套接字 当用户位于站点上时通过套接字发送数据来记录信息 并在用户离开站点时将信息存储在数据库中 我当前面临的问题是 虽然我可以检测到套接字何时与服务器断开连接 但我不知道哪个套接字对应
  • XML 到 C# 类中的 StackOverflowException

    我正在尝试基于以下 XML 代码在 C 中创建一个类
  • dbo.数据库对象名称中的前缀,我可以忽略它吗?

    我正在寻找一个高性能的默认策略来处理 dbo 前缀 我意识到 dbo 前缀不仅仅是语法噪音 但是我在过去 8 年的基于 MS 的开发中跳过了 dbo 的输入 前缀并忽略其功能 除了存储过程编译锁的性能问题之外 在 SQL 查询和存储过程中跳
  • 如何将必要的文件包含到独立客户端项目的输出中?

    我的解决方案包括 Client 启动项目 UI层 依赖于取决于 App App 库 应用层 汇编器 依赖于取决于 Lib1 Lib1 库 业务逻辑层 需要特定文件才能正常工作 ThirdParty dll 我已经添加ThirdParty d
  • SQL Server CE数据库大小问题

    我有一份来自一家倒闭公司的申请 它似乎使用 SQL Server CE 数据库 我搜遍了系统也没找到 sdf文件 看来数据库已经变得太大了 知道如何找到数据库并更改最大大小吗 错误信息 无法记录应用程序启动 System Data Enti
  • 最长公共子序列:为什么这是错误的?

    int lcs char A char B int m strlen A int n strlen B int X malloc m sizeof int int Y malloc n sizeof int int i int j for
  • 将 MVC 2 升级到 MVC 3 视图问题

    我正在尝试将现有的 ASP net MVC 2 Web 应用程序升级到 MVC 3 这样我就可以使用 Razor Viewengine 等的优点said http weblogs asp net scottgu archive 2010 0
  • 如何在Python中使图像适合标签

    所以在 python 中我有一个用于显示图像的标签 但图像相当大 超出了标签的大小 有没有办法加载图像以适合标签而不调整它们的大小 这就是我现在所做的 labelWidth top winfo screenwidth labelHeight
  • Railsauthenticate_or_request_with_http_basic

    在我的 RoR 应用程序中 我需要使用基本身份验证来保护页面 并且我希望每次用户链接到该页面时都会询问凭据 所以我在操作之前添加了一个过滤器 如下所示 before filter request confirm only gt delete
  • 在react-js中播放声音

    我尝试在react js 上播放声音 但无法启动 在获取 InitialState 之前 我在 ReactClass 中初始化了声音变量 var App React createClass audio new Audio files aud
  • 在 Android 中创建选项菜单

    我正在尝试在 android 中制作一个选项菜单 如下链接http developer android com guide topics ui menus html options menu http developer android c
  • 根据数据库结果设置 Yii2 catchAll 路由

  • vh 中的最小高度与身体的百分比?

    我试图理解代码 为什么需要指定 body body position relative overflow hidden min height 100vh 将 html 设置为 min height 100vh html height 100
  • 在 powershell 中将新的键值对添加到 JSON 文件。

    我有一个现有的 JSON 文件 其中包含以下内容 buildDate 2017 08 16 version v1 2 0 如何将新的键值对添加到现有的 JSON 文件中 例如 我想采用上面的 JSON 并最终得到以下结果 buildDate
  • Rollup ESM 生成损坏的导入

    我想将 typescript React App 作为组件捆绑到 ES 模块或 UMD 中 但是生成的 ES 包会产生无效的模块 js 在捆绑包上它给了我这个提示 但我找不到任何解决方案 Missing global variable na
  • 使用 Sharepoint 2013 REST Api / CSOM 检索发布图像字段

    我们使用 Sharepoint 2013 REST API 从 Sharepoint 获取所有新闻项目 我们制作了一个自定义 ContentType Newsitem 具有多个属性 包括发布图像字段 var contentTypeId 0x
  • 使用 expo go 保持 firebase 登录的最佳方法

    我正在尝试使用 React Native 制作一个应用程序Expo Go 已经成功让谷歌登录工作 一切都很好 不幸的是 用户的登录在应用程序重新启动之间不会保留 起初 我认为这是一个异步存储问题 但我可以在重新启动之间将项目保存在存储中 我
  • ORA-01735: 无效的 ALTER TABLE 选项 - Toad

    当我在 Toad 中执行下面的 SQL 时 它会抛出 ORA 01735 无效的 ALTER TABLE 选项 ALTER TABLE CALCULATE ADD CAL METHOD VARCHAR2 50 REMARKS VARCHAR
  • ClientRequestFilter 与 ContainerRequestFilter

    我知道过滤器用于处理请求 并且可以使用 http 标头和 httpmethods 执行操作 但我很困惑 有什么区别ClientRequestFilter and ContainerRequestFilter 什么场景下我们必须使用Clien
  • DBContext Find with Includes - 其中带有主键的 lambda

    我正在编写一个通用存储库以使用 DBContext 与 EF 交互 我有一个通用的 Get 方法 它接收主键值并返回实体 public class DALRepository