LINQ,如何选择具有两列的distinct

本文关键字:两列 distinct 何选择 选择 LINQ | 更新日期: 2023-09-27 18:29:53

在下面的select query中,我需要显示不同的值,但由于我将DataText字段显示为一个值,并且可选择的是DataValue,我如何才能获得不同的值。

所以我想显示我的选择列表中的每个零件,这些零件在子字段中有一个值,但子字段在许多零件记录中有重复的值,所以我想展示一个有子字段的零件,但如果零件有重复的子字段,那么我不会显示该零件。当子字段是重复时,排除哪个部分并不重要

IEnumerable<SelectListItem> pList = (from p in db.Part
                     where (p.field != null || p.field!= "")
                     select p).Distinct().OrderByDescending(l => l.ID).ToArray().Select(x => new SelectListItem

         {
                 Value = x.ID.ToString(),
                 Text = x.subfield
                 });
            ivm.Ids= pList;


<div class="bodyContent">
            <span class="leftContent"><a id="''" href=''>
                @Html.Label("Part Number ")</a> </span><span class="rightContent">
                    @Html.ListBoxFor(model => model.SelectedPNos, Model.IDs, new { id = "partIdLst", name = "listbox", @class = "chosen-select", multiple = "multiple", data_placeholder = "Click here to Select Part Number", style = "width:90%;", tabindex = "5" })
                </span>
        </div>

LINQ,如何选择具有两列的distinct

据我所知,您希望通过subfield来区分记录。如果是,您可以使用GroupBy:

var pList = db.Part.Where(p => p.field != null && p.field!= "")
             .OrderByDescending(l => l.ID)
             .AsEnumerable()
             .GroupBy(x => x.subfield)
             .Select(x => x.First())
             .Select(x => new SelectListItem
             {
                 Value = x.ID.ToString(),
                 Text = x.subfield
             });

或者,如果你可以使用第三方库,我推荐DistinctBy方法

 var pList = db.Part.Where(p => p.field != null && p.field!= "")
             .OrderByDescending(l => l.ID)
             .AsEnumerable()
             .DistinctBy(x => x.subfield)
             .Select(x => new SelectListItem
             {
                 Value = x.ID.ToString(),
                 Text = x.subfield
             });

我通过将ToArray更改为AsEnumerable来优化您的代码,如果您只想获取结果,您可以使用AsEnumerable,它将执行查询并枚举结果,您不需要将结果放入集合中。

@Selman Genc给出的答案很有帮助,但对我来说并不是这样。我不得不把它分成两部分。所以我就这样做了。。。

var pList = db.Part.Where(p => p.field != null && p.field!= "")
         .OrderByDescending(l => l.ID)
         .GroupBy(x => x.subfield).ToList();
var finalList = pList.Select(x => x.FirstOrDefault())
         .Select(x => new SelectListItem
         {
             Value = x.ID.ToString(),
             Text = x.subfield
         }).ToList();

我不知道为什么它不能在单行中工作,它也不能与First()一起工作。我遇到了一个异常,我不得不使用FirstOrDefault()。我有61张唱片,但在Distinct我应该有24张。如果我使用.Select(x=>x.FirstOrDefault())Group(),我仍然获得了61条记录。但在我把它分成两部分后,它起了作用。