【问题标题】:Select distinct using LINQ but base distinct on another column使用 LINQ 选择不同但基于另一列的不同
【发布时间】:2016-12-19 18:17:11
【问题描述】:

当存在类似于以下的对象时,我应该如何使用 LINQ 选择 distinct:

public class foo
{
    public int id { get; set; }
    public string lang { get; set; }
    public string name { get; set; }    
}

列表可能是:

 id = 1, lang = "en", name="test1"
 id = 1, lang = "fr", name="test2"
 id = 1, lang = "de", name="test3"
 id = 2, lang = "en", name="test4"
 id = 2, lang = "fr", name="test5"
 id = 3, lang = "en", name="test6"
 id = 3, lang = "fr", name="test7"
 id = 4, lang = "en", name="test8"
 id = 5, lang = "de", name="test9"

我想运行 LINQ 以便它返回不同的 id 值,但是应该根据 lang 过滤不同的 id 值 例如"fr",应检索以下结果:

 id = 1, lang = "fr", name="test2"
 id = 2, lang = "fr", name="test5"
 id = 3, lang = "fr", name="test7"
 id = 4, lang = "en", name="test8"
 id = 5, lang = "de", name="test9"

各位 LINQ 专家,理想情况下,我正在寻找使用 lambda 的查询,这将是一个很大的帮助。提前致谢。

【问题讨论】:

  • 这听起来更像是简单的Where 而不是Distinct
  • foos.Where(x => x.lang == "fr")
  • 感谢埃文和杰森。我已经更改了描述,如果没有“fr”记录,我需要检索其他记录。

标签: linq c#-4.0


【解决方案1】:

id 对项目进行分组,并从每个组中取出按lang != "fr" 排序的第一个项目。这将使“fr”项浮动到每个组的顶部(falsetrue 之前排序):

list.GroupBy(f => f.id)
    .Select(g => g.OrderBy(f => f.lang != "fr").FirstOrDefault())

【讨论】:

  • 要解决“无法转换”错误,您应该显示您的原始代码。这与 LINQ 没有直接关系。
【解决方案2】:

这个呢:

foos.GroupBy(el => el.id)
    .Select(gr => new
        {
            foo = gr.Any(el => el.lang == "fr") ? gr.FirstOrDefault(el => el.lang == "fr") : gr.FirstOrDefault()
        });

【讨论】:

  • 每组执行两次迭代。如果你这样做gr.FirstOrDefault(el => el.lang == "fr") ?? gr.FirstOrDefault(),这将减少到每组一到两次迭代。
  • 嗨,蒂姆和格特,谢谢,目前它似乎返回 null,所以不确定我是否使用了正确的语法: IQueryable allIndexCenters = ContentService.GetAllCenters(); IQueryable allCenters = null; allIndexCenters.GroupBy(x => x.FREDID) .Select(gr => new { allCenters = gr.Any(el => el.Language == "fr") ? gr.FirstOrDefault(el => el.Language == "fr") : gr.FirstOrDefault() }).AsQueryable();
  • 当我尝试以下操作时: var allCenters = allIndexCenters.GroupBy(x => x.FREDID) .Select(gr => new { SearchResultCentrePage = gr.Any(el => el.Language == "fr") ? gr.FirstOrDefault(el => el.Language == "fr") : gr.FirstOrDefault() }).AsQueryable();我收到错误消息:无法从 'System.Linq.IQueryable>' 转换为 'System.Linq.IQueryable'
  • 伙计们,我不是 LINQ 专家,请你给我一个方向,因为代码看起来正是我想要的。
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 2012-01-24
相关资源
最近更新 更多