【问题标题】:LINQ, how to select distinct with two columnsLINQ,如何选择不同的两列
【发布时间】:2014-11-08 21:15:58
【问题描述】:

在下面的选择查询中,我需要显示不同的值,但由于我将 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 to sql 或 EF 吗?
  • @Selman22 我指的是他关于逻辑的评论,对于不同的问题,我正在尝试你的解决方案
  • 不,我的意思是 string.IsNullOrEmpty 不应该被支持它是如何工作的?
  • 你是对的,在 EF !string.IsNullOrEmpty(p.field) 在我的特定查询中不起作用

标签: c# linq


【解决方案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,它将执行查询并枚举结果,您无需输入将结果放入一个集合中。

【讨论】:

    【解决方案2】:

    @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 条记录。但是在我把它分成两部分之后它就起作用了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多