C# LINQ Select multiple or语句返回distinct
我想搜索多个数据集中具有键约束的多个列。搜索功能本身可以工作,但在应用时会返回一个错误,说明无法找到可比较的键C# LINQ Select multiple or语句返回distinct,c#,linq,C#,Linq,我想搜索多个数据集中具有键约束的多个列。搜索功能本身可以工作,但在应用时会返回一个错误,说明无法找到可比较的键 public async Task<ActionResult> SearchResults(string q) { var SearchResult = from Result in db.comments select Result; if (!String.IsNullOrEmpty(q)) {
public async Task<ActionResult> SearchResults(string q)
{
var SearchResult = from Result in db.comments select Result;
if (!String.IsNullOrEmpty(q))
{
var Found = SearchResult.Where(Result => Result.ticket.summary.ToUpper().Contains(q.ToUpper()) || Result.ticket.main_ticket.Contains(q) || Result.ticket.detailed_description.Contains(q.ToLower()) || Result.ticket.ticket.Contains(q) || Result.comment.Contains(q));
if (Found== null)
{
return Content("No Data.");
}
else
{
ViewBag.SearchCount = Found.Count();
return View(Found.ToList());
}
}
else
{
return Content("404");
}
}
//数据库注释
||---------------||
|| comment_id ||
|| comment ||
|| RowVerison ||
||---------------||
我知道当我搜索字母T时发生了什么,它会在comments.comment、tickets.summary和tickets.detail\u description中找到字母T
如何将返回的结果限制为不同的密钥对
我是否应该基于返回的数据创建一个列表,然后比较该列表并只显示不同的数据
还是有一种更简单的方式让我看得过火
[更新-找到解决方案]
如果我使用的是模型,而不是连接到.edmxsqlexpress服务器表中的控制器,安德烈的答案应该是解决方案。我建议先用他的例子,再用我的例子
虽然Distinct无法导入Ajax库并使用DistinctBy工作
using Microsoft.Ajax.Utilities;
我把我的Where行改成这个
var Found = SearchResult.Where(Result => Result.ticket.summary.ToUpper().Contains(q.ToUpper()) || Result.ticket.main_ticket.Contains(q) || Result.ticket.detailed_description.Contains(q.ToLower()) || Result.ticket.ticket.Contains(q) || Result.comment.Contains(q)).DistinctBy(Result => Result.ticket_id).ToList();
并从我的视图返回中删除.ToList
return View(Found);
这将向我的ViewBag.SearchCount返回正确数量的结果,并向我的Razor视图返回正确数据
@model IEnumerable<TICKETS.Controllers.comments>
@{
ViewBag.Title = @ViewBag.SearchCount+ " result(s) for: ";
}
<div class="row">
<div class="col-lg-8">
<div class="panel panel-color panel-info">
<div class="panel-heading">
<h3 class="panel-title">All Results - @ViewBag.SearchCount Result(s) found.</h3>
</div>
<div class="panel-body">
@foreach (var item in Model) {
<h3>
<a data_modal="" href="@Url.Action("Details","TICKETS", new{ @id=item.ticket_id})" id="open_modal">@Html.DisplayFor(modelItem => item.tickets.summary)</a>
</h3>
<p>@item.ticket_id :@Html.DisplayFor(modelItem => item.tickets.start_date) - @Html.DisplayFor(modelItem => item.tickets.end_date)</p>
<p>@Html.DisplayFor(modelItem => item.tickets.detailed_description)</p>
<hr />
}
</div>
</div>
</div>
</div>
C不知道如何比较结果实例。因此,您需要引入结果类实例的显式比较 您需要实现IEqualityComparer接口,并将此接口的实例传递到.DistinctresultEqualityComparer调用中 假设我有一个类用户:
class User
{
public string Id { get; set; }
public string Name { get; set; }
}
这是我比较用户类实例的方式:
class UserEqualityComparer : IEqualityComparer<User>
{
public bool Equals(User user1, User user2)
{
return user1.Id == user2.Id;
}
public int GetHashCode(User user)
{
return user.Id;
}
}
因此,名为Lorem的用户将从集合中筛选出来。C不知道如何比较结果实例。因此,您需要引入结果类实例的显式比较 您需要实现IEqualityComparer接口,并将此接口的实例传递到.DistinctresultEqualityComparer调用中 假设我有一个类用户:
class User
{
public string Id { get; set; }
public string Name { get; set; }
}
这是我比较用户类实例的方式:
class UserEqualityComparer : IEqualityComparer<User>
{
public bool Equals(User user1, User user2)
{
return user1.Id == user2.Id;
}
public int GetHashCode(User user)
{
return user.Id;
}
}
因此,名为Lorem的用户将从集合中筛选出来。谢谢您,Andrei,我将使用IEqualityComparer扩展我的类以进行比较。我当时90%是我需要走的路线…但我想我希望有一个更简单的解决方案。并不是说你的答案不简单!我感谢您的反馈!我将您的回答标记为答案,如果您创建了一个类模型,它将起作用。我使用EntityFrame工作和数据库优先的方法,因此您的响应虽然易于实现,但却迫使我为我的控制器创建一个类。我通过最新的问题绕过了这个问题。再次非常感谢你为我指明了正确的方向。@Chris很高兴这有帮助。祝你好运谢谢Andrei,我将扩展我的类以使用IEqualityComparer进行比较。我当时90%是我需要走的路线…但我想我希望有一个更简单的解决方案。并不是说你的答案不简单!我感谢您的反馈!我将您的回答标记为答案,如果您创建了一个类模型,它将起作用。我使用EntityFrame工作和数据库优先的方法,因此您的响应虽然易于实现,但却迫使我为我的控制器创建一个类。我通过最新的问题绕过了这个问题。再次非常感谢你为我指明了正确的方向。@Chris很高兴这有帮助。祝你好运