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>
据我所知,您希望通过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条记录。但在我把它分成两部分后,它起了作用。