LINQ,如何用两列选择distinct

时间:2014-11-08 21:15:58

标签: c# linq

在下面,选择查询,我需要显示不同的值,但由于我将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>

2 个答案:

答案 0 :(得分:1)

据我所知,您希望通过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,它会执行查询并枚举结果,您不需要将结果放入集合中。

答案 1 :(得分:0)

@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条记录。如果我紧随。 Group()之后使用 .Select(x => x.FirstOrDefault()),我仍获得61条记录。但是在我将其分为两部分后,它开始起作用了。