首页 > 解决方案 > 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 表达式过滤嵌套查询?

标签: c#entity-frameworklinqentity-framework-6repository-pattern

解决方案


我找到了解决这个问题的方法。这里的主要挑战是在嵌套 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 条件。这将返回所需的结果。


推荐阅读