【问题标题】:How to search on the basis of all the variable parameters如何根据所有可变参数进行搜索
【发布时间】:2019-08-29 13:58:19
【问题描述】:

我正在尝试编写一个搜索功能,其中用户可以根据 Id、UserName 和状态进行搜索。这些搜索过滤器对应的数据在不同的表中,所以我必须对这些表进行连接。

当然,用户可以根据 Id 和 UserName 或 UserName 和 status 以及可以从这 3 个过滤器中考虑的所有组合进行搜索。

我所做的是使用不同的函数来处理这些组合。

有没有一种方法可以通过使用 linq 的一种方法来实现。我试图避免 if-else 和 switch。

我已经调查过了 Add Conditional Join Dynamically with LinqLINQ - Joins in a dynamic query

这是我根据所有参数搜索的代码

public List<Application> GetApplication(int? applicationId, string userName, string status)
{
     _applicationlist.Clear();
     if (applicationId != 0 && !string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(status))
     {
         var application = (from a in _targetDbContext.DbSet<ApplicationEntity>()
                           join u in _targetDbContext.DbSet<UserEntity>() on a.InDraftPersonnel equals GetUserID(userName)
                           join v in _targetDbContext.DbSet<ApplicationVersionEntity>() on a.Id equals v.ApplicationId
                           join s in _targetDbContext.DbSet<ApplicationStatusEntity>() on v.VersionStatus equals s.Id
                           where a.Id.Equals(applicationId)
                           where u.UserName.Equals(userName)
                           where s.StatusName.Equals(status)
                           select (new Application
                           {
                               Id = a.Id,
                               AppName = a.AppName,
                               CreatedBy = a.CreatedBy,
                               CreatedOn = a.CreatedOn
                           })).FirstOrDefault();
            _applicationlist.Add(application);

        }
        return _applicationlist;
}

问题是我不确定用户是否会只使用一个参数进行搜索。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    删除 if 并试试这个:

    where (!applicationid.HasValue || applicationid == 0 || a.Id.Equals(applicationId)) &&
    (string.IsNullOrWhiteSpace(userName) || u.UserName.Equals(userName)) &&
    (string.IsNullOrWhiteSpace(status) || s.StatusName.Equals(status))
    

    使用此 where 子句,所有参数都是可选的,如果其中一个为 null 或为空,则这些参数不会影响查询结果,并且支持所有组合。

    【讨论】:

    • @Rashidi 这也返回 null
    • 如果一个或多个参数为 null 或 0 这些参数不影响查询结果。如果不起作用,请检查您的数据或发送您的样本数据
    • @rashidi 似乎它在 1 个条件下工作正常,但结合它不是因为我是基于非此即彼检查记录。所以到底发生了什么,假设我搜索“活动”状态,它会给我所有活动记录,但是当我搜索状态和 Id(不输入任何值)时,它给我 null。为什么 ?因为有一个“和”条件检查状态的记录:活动和 Id:null / Id:任何值,我的数据库中没有这样的记录
    • 您的问题是 null applicationid。检查这个编辑过的。此检查 applicationid 的 null 值
    【解决方案2】:

    ...
    where a.Id.Equals(applicationId) && u.UserName.Equals(userName) && s.StatusName.Equals(status)
    ...
    

    ...所有参数必须匹配


    ...
    where a.Id.Equals(applicationId) || u.UserName.Equals(userName) || s.StatusName.Equals(status)
    ...
    

    ...至少有一个参数必须匹配。


    ...
    where a.Id.Equals(applicationId) && u.UserName.Equals(userName) && s.StatusName.Equals(status)
    ...
    

    等价于

    ...
    where a.Id.Equals(applicationId)
    where u.UserName.Equals(userName)
    where s.StatusName.Equals(status)
    ...
    

    另请参阅:Boolean logical operators (C# reference)


    请注意,您可以逐个构建 LINQ 查询。

    var query = source.Join(..) ...;
    
    if (applicationId.HasValue) {
        query = query.Where(x => x.Id == applicationId.Value);
    }
    if (!String.IsNullOrEmpty(userName)) {
        query = query.Where(x => x.UserName == userName);
    }
    if (!String.IsNullOrEmpty(status)) {
        query = query.Where(x => x.StatusName == status);
    }
    query = query.Select(x => ...);
    

    【讨论】:

    • @Jacot 您的第一个建议返回 null。我认为您正在检查值或空值。这不会使参数成为可选参数。我正在寻找的是,如果值存在,那么我们查询该值,否则我们将它们设为可选。
    • 是的,我对构建的 LINQ 查询的最后建议就是这样做的。
    • 这是一种方法。我认为也可以通过表达式树来完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2015-02-15
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多