在下面,选择查询,我需要显示不同的值,但由于我将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>
答案 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条记录。但是在我将其分为两部分后,它开始起作用了。