【问题标题】:Distinct and order list LINQ区分顺序列表 LINQ
【发布时间】:2014-04-11 01:14:57
【问题描述】:

使用实体框架,我有以下代码返回一个列表:

    private List<string> MyList()
    {
        using (MyEntities ctx = new MyEntities())
        {
            var myList= from a in ctx.Foo
                        orderby a.Bar
                        select a.Bar;

            return myList.ToList();
        }
    }

这很好用,但我想要一个不同的列表。为此,我尝试了以下代码,将 .Distinct() 添加到选择中:

    private List<string> MyList()
    {
        using (MyEntities ctx = new MyEntities())
        {
            var myList= from a in ctx.Foo
                        orderby a.Bar
                        select a.Bar.Distinct();

            return myList.ToList();
        }
    }

很遗憾,这个新代码会导致错误:

无法将类型“System.Collections.Generic.List(System.Collections.Generic.IEnumberable(char))”隐式转换为“System.Collections.Generic.List(string)”

然后我尝试了这段代码,它确实给了我一个不同的列表,但现在看来 orderby 不起作用,因为结果未排序:

    private List<string> MyList()
    {
        using (MyEntities ctx = new MyEntities())
        {
            var myList= (from a in ctx.Foo
                        orderby a.Bar
                        select a.Bar).Distinct();

            return myList.ToList();
        }
    }

有什么想法可以返回一个不同的 AND 排序列表吗?

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    试试这个

    private List<string> MyList()
    {
        using (MyEntities ctx = new MyEntities())
        {
            var myList= ctx.Foo.Select(a => a.Bar).Distinct().OrderBy(a => a);
    
            return myList.ToList();
        }
    }
    

    【讨论】:

      【解决方案2】:

      一种有效的方法是使用 groupby

      private List<string> MyList()
      {
          using (MyEntities ctx = new MyEntities())
              return ctx.Foo.GroupBy(a => a.Bar).Select(g => g.Key).OrderBy(a => a).ToList();
      }
      

      你可以像这样在 linqpad 中测试它:

      void Main()
      {
          var Foo = Enumerable.Range(0,50).Select(i => new { id = i, Bar = i%3}).ToList();
          var myList= Foo.GroupBy(a => a.Bar).Select(g => g.Key).OrderBy(a => a).ToList();
          Console.WriteLine(myList);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        相关资源
        最近更新 更多