Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ Select multiple or语句返回distinct_C#_Linq - Fatal编程技术网

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很高兴这有帮助。祝你好运