使用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新手,请帮忙。
这应该是一个良好的开端。它不像你想要的那样区分大小写,它不是文化独立的,但它应该给你一个想法。
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);