首页 > 解决方案 > LINQ:如何构造一个 IQueryable基于实体属性的搜索条件,包括多对多关系

问题描述

我努力构建并轻松找到正确的信息来定义表达多对多标准的 LINQ,因此是问答。

请修改/改进/更正/...

基本情况:

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 是定制的枚举

标签: linqmany-to-manyiqueryable

解决方案


  1. 构造一个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);                  
} 

推荐阅读