linq - LINQ:如何构造一个 IQueryable基于实体属性的搜索条件,包括多对多关系
问题描述
我努力构建并轻松找到正确的信息来定义表达多对多标准的 LINQ,因此是问答。
请修改/改进/更正/...
基本情况:
- .Net Entity Framework 代码优先
- 我们使用 UnitOfWork 存储库,但这在这里并不重要
- 我们定义一个
IQueryable<MyCustomMadeEntity>
查询 - 用户通过表单提交他的搜索条件,每个条件直接匹配 MyCustomMadeEntity 的属性或与 MyCustomMadeEntity 具有多对多关系的另一个实体的属性,例如:
public class MyCustomMadeEntity : BaseEntity
{
public string ArticleCode { get; set; }
public string Comment { get; set; }
public Guid? ColorId { get; set; }
public ArticleColor Color { get; set; }
public ICollection<ArticleStatus> ArticleStatuses { get; set; }
}
和
public class MyCustomMadeEntity : BaseEntity
{
// properties
Public LocationType LocationType { get; set; }
}
(如果 LocationType 是定制的枚举
解决方案
- 构造一个
IQueryable<Entity>
表示数据库源的基础以及基础表与其他表的链接(连接等)
IQueryable<CustomMadeEntity> query = _UnitOfWork. ustomMadeEntityRepository
.Queryable()
.Include(el => el.OtherEntity);
query = PerformAdvancedSearch(criteria, query);
2.修改查询变量逐步检查单个搜索条件
public static IQueryable<CustomMadeEntity> PerformAdvancedSearch(SearchRequestDto criteria, IQueryable< CustomMadeEntity > query)
{
if (!string.IsNullOrWhiteSpace(criteria.ArticleCode))
{
query = query.Where(el => el. ArticleCode == criteria. ArticleCode));
}
}
包含、><、…</p> 的附加查询逻辑
if (something)
{
query = query.Where(el => el.ArticleStatuses.OrderByDescending(el => el.CreatedOn).Any() &&
el.ArticleStatuses.OrderByDescending(el => el.CreatedOn)
.FirstOrDefault().LocationType == criteria.LocationType);
}
推荐阅读
- c++ - 使用 constexpr 初始化非常量静态字符串
- typescript - SystemJS 看不到导出
- spring-boot - Spring Thymeleaf 中的可编辑表
- flutter - Expanded Widget 抛出“RenderBox 未布局”异常
- nativescript - 列表视图上的三元操作不适用于 nativescript
- c# - 您如何在代码中组织您的操作方法和控制器 - 通过 url 或返回的实体?
- java - Spring核心中的自动装配冲突与xml配置
- swift - 如何获取 uiview 的任何信息(视觉调试器报告的原始地址)
- android - 如何解决打开 Android Studio 时出现的“port.lock”错误?
- angular - 如何更改角字体真棒中“fa-icon”元素的旋转速度?