gpt4 book ai didi

c# - LINQ Select multiple or statement return distinct

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:01 27 4
gpt4 key购买 nike

我想在具有键约束的多个数据集中搜索多个列。搜索功能本身有效,但在应用 .Distinct() 时会返回一个错误,说明它无法找到可比较的键。

    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");
}
}

//数据库门票

||------------------------||
|| ticket_id ||
|| summary ||
|| main_ticket ||
|| detailed_description ||
|| ticket ||
|| comment_id ||
||------------------------||

//数据库注释

||---------------||
|| comment_id ||
|| comment ||
|| RowVerison ||
||---------------||

我知道当我搜索字母 T 时它会在 comments.comment、tickets.summary 和 tickets.detail_description 中找到字母 T

如何将返回结果限制为不同的 key 对?

我是否应该根据返回的数据创建一个列表,然后比较列表并只显示 Distinct?

或者有没有更简单的方法让我忽略?

[更新 - 找到解决方案]如果我一直在使用模型而不是连接到 .edmx SQLExpress 服务器表的 Controller ,Andrei 的回答就是解决方案。我建议在使用我的示例之前使用他的示例。

虽然 Distinct 无法导入 Ajax 库并使用 DistinctBy Worked!

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();

并从我的 Return View 中删除了 .ToList()。

return View(Found);

这向我的 ViewBag.SearchCount 返回了正确数量的结果,并且还向我的 Razor View 返回了正确的数据

@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# 不知道如何比较您的结果实例。因此,您需要引入 Result 类实例的显式比较。

您需要实现 IEqualityComparer<Result>接口(interface)并将此接口(interface)的实例传递给您的 .Distinct(resultEqualityComparer)打电话。

假设我有一个用户类:

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;
}
}

GetHashCode 是一个应该返回唯一的函数 int不同用户实例的值。 Id将是理想的,如果你没有它,你将不得不根据你的类属性开发你自己的公式。

用法很简单:

var users = new List<User>();

users.Add(new User { Id = 1, Name = "John" });
users.Add(new User { Id = 1, Name = "Lorem" });
users.Add(new User { Id = 2, Name = "Smith" });

users.Distinct(new UserEqualityComparer());

因此,名称为 Lorem 的用户将从集合中过滤掉。

关于c# - LINQ Select multiple or statement return distinct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32051339/

27 4 0
文章推荐: c# - 如何将 Dictionary 作为 XUnit 的 MemberData 需要的 IEnumerable 返回