c# - EF 如何使用 .include() 和使用存储库模式查询更多实体
问题描述
我得到了下面的 sql 语句,我想用带有 linq(lambda 表达式)的实体框架来实现。这是SQL:
select *
from tbl_ExampleStoneCatalog
join tbl_ExampleStoneCategory
on tbl_ExampleStoneCatalog.fk_ESC = tbl_ExampleStoneCategory.pk_ESC
join tbl_ExampleStones
on tbl_ExampleStoneCatalog.fk_ES = tbl_ExampleStones.pk_ES
join tbl_ExampleReviewStoneCatalog
on tbl_ExampleStones.pk_ES = tbl_ExampleReviewStoneCatalog.fk_ES
where .fk_StoneCategory = '%someParameter%'
我尝试使用 .include() 这让我想到了这一点:
var res = (await this._exampleStoneCatalog.Query()
.include(esc => esc.ExampleStoneCategory)
.include(es => es.ExampleStones)
.include(es => es.ExampleStones.ExampleReviewStoneCatalog))
.Where(w => w.ExampleStones.ExampleReviewStoneCatalog.Any(
a => a.StoneCategoryID.Equals(%someParameter%)));
不幸的是,上述代码不会给我带来想要的结果。此外,其中还有一个嵌套的Where条件 => ExampleStones.ExampleReviewStoneCatalog.StoneCategoryID
。经过一些研究,我了解到,使用 .include() 无法轻松解决此问题。
是否有其他方法可以使用 lambda 表达式过滤嵌套查询?
解决方案
我找到了解决这个问题的方法。这里的主要挑战是在嵌套 SQL 查询中进行过滤。我找不到 .include() 的解决方案。特别是我当前使用存储库模式的工作环境不允许我在包括以下内容中进行过滤:
var res = await this._exampleStoneCatalog.Query().include(x => x.ExampleStones.ExampleReviewStoneCatalog.Where(w => w.StoneCategoryID.Equals(%SomeParameter%))).SelectAsync();
因此,我使用 linq to sql 得出以下解决方案。
我的解决方案:
var exampleStoneCatalogEnum = await this._exampleStoneCatalog.Query().SelectAsync();
var exampleStoneCategoryEnum = await this._exampleStoneCategoryRepository.Query().SelectAsync();
var exampleStonesEnum = await this.exampleStonesRepository.Query().SelectAsync();
var exampleReviewStoneCatalogEnum = await this.exampleReviewStoneCatalogRepository.Query().SelectAsync();
var result = from exampleStoneCatalog in exampleStoneCatalogEnum
join exampleStoneCategory in exampleStoneCategoryEnum on exampleStoneCatalog.Id equals exampleStoneCategory.Id
join exampleStones in exampleStonesEnum on exampleStoneCatalog.Id equals exampleStones.Id
join exampleReviewStoneCatalog in exampleReviewStoneCatalogEnum on exampleStones.Id equals exampleReviewStoneCatalog.Id
where exampleReviewStoneCatalog.StoneCategoryID.Equals(revCategory)
select exampleStoneCatalog;
return result;
如您所见,我首先获取每个表的所需数据并将它们加入我的结果中,包括最后的 where 条件。这将返回所需的结果。
推荐阅读
- javascript - Electron 2.0.12 版安装后出现错误
- r - 替代坐标包
- string - 如何将 Int 值转换为字符串?
- java - 启动时缓存数据集?
- javascript - rn-fetch-blob addAndroidDownload 不获取
- java - 是否可以在 OpenXava 免费版中创建多个用户?
- python-3.x - 在 Python 中导入 Excel,同时保留下拉菜单
- php - 获取 caldav 对象的值
- java - Maven 在 Docker 上的构建和测试速度非常慢
- javascript - TypeError:无法获取和 POST 获取状态 = 已取消