使用Linq从数据库中查询对象,并检查它们是否在另一个列表或数组中退出

本文关键字:是否 另一个 列表 数组 退出 检查 数据库 Linq 查询 对象 使用 | 更新日期: 2023-09-27 18:15:28

更新:这是我想要完成的。我的视图有一个文本框和一个搜索按钮。输入搜索参数并单击按钮后,文本框和按钮被隐藏,结果显示在同一视图中。我是否应该以不同的方式做这件事(也许是另一种观点)?因为我得到了以下错误

NotSupportedException: Could not parse expression '__words_0。任何(转换(布尔包含System . string) (.CreateDelegate (System.Func 2 [System.String、系统。[Boolean], job.Description)))':给定的参数与期望的参数不匹配:类型为'System.Linq.Expressions '的对象。UnaryExpression'不能转换为'System.Linq.Expressions.LambdaExpression'类型。

它抱怨下面的行@if (!Model.Any())

视图

@model IEnumerable<TheVesume.Jobs>
<div id="search" class="search">
    @if (!Model.Any())
    {
    <form>
        <div class="row">
            <div class="col-md-9">
                <h4>What</h4>
                <p>@Html.TextBox("SearchString")</p>
            </div>
            <div class="col-md-3">
                <input type="submit" value="Find" class="btn btn-default">
            </div>
        </div>
    </form>
    }
    @if (Model.Any())
    {
        @foreach (var item in Model)
        {
            <div>
                @Html.DisplayFor(modelItem => item.Title)
            </div>
            <div>
                @Html.DisplayFor(modelItem => item.Description)
            </div>
        }
    }
</div>

我想创建一个求职网站,我需要一种方法来搜索工作表在我的数据库。我用的是实体框架。这是目前为止的内容

模型
public partial class Jobs
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string Requirements { get; set; }
    public string Title { get; set; }
}
控制器

public IActionResult Index(string searchString)
{
    var query = from t in db.Jobs
                select t;
    if (!String.IsNullOrEmpty(searchString))
    {
        var strings = searchString.Split(' ');
    }
    return View(whatever);
}

我需要从包含searchString中任何字符串的查询返回所有内容到视图。如果searchString在Title, Description或Requirements中。我是linq新手,请帮忙。

使用Linq从数据库中查询对象,并检查它们是否在另一个列表或数组中退出

这应该是一个良好的开端。它不像你想要的那样区分大小写,它不是文化独立的,但它应该给你一个想法。

public IActionResult Index(string searchString)
{
    var query = from t in db.Jobs
                select t;
    if (String.IsNullOrEmpty(searchString))
    {
        return View(query);
    }
    var words = searchString.Split(' ');
    var jobsMatching = query.Where(job => words.Any(job.Description.Contains)
                                       || words.Any(job.Title.Contains)
                                       || words.Any(job.Requirements.Contains));
    return View(jobsMatching);
}

我相信你想搜索你的搜索字符串到标题,描述和需求而不是其他方式寻找标题,描述和需求在搜索字符串

您可以使用此帮助谓词构建器类来构建Or/And查询

public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }
        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
        }
        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }

使用上面的谓词帮助器,您可以构建下面的谓词并将其传递给linq表达式

 var searchStrings = searchString.Split(' ');
  var predicate = PredicateBuilder.False<Jobs>();
                foreach (var searchStr in searchStrings)
                {
                   predicate = predicate.Or(p => p.Title.Contains(searchStr) || p.Description.Contains(searchStr) || p.Requirements.Contains(searchStr));
                }
var jobsMatching = query.Where(predicate);