【问题标题】:c# linq Groupby query ignoring Where on boolc# linq Groupby 查询忽略 Where on bool
【发布时间】:2020-01-12 09:03:41
【问题描述】:

我有一个 IEnumerable,我尝试先在 bool 上使用 .Where 进行过滤,然后像这样使用 GroupBy 进行过滤

int someInt = orderEditorViewModel.EditOrderFitters.Where(f => f.Delete == false).GroupBy(f => f.OrderFitter.Person).Count();

EditOrderFitters 是一个列表

    public class EditOrderFitter
    {
        [Display(Name = "Delete?")]
        public bool Delete { get; set; }
        public bool Added { get; set; }  // this is hidden
        public OrderFitter OrderFitter { get; set; }
    }

但即使 Delete 为 true,查询也包含 EditOrderFitter

我首先使用了这个冗长的解决方法来过滤掉

List<EditOrderFitter> notDeletedOrderFitters = new List<EditOrderFitter>();
      foreach (EditOrderFitter e in orderEditorViewModel.EditOrderFitters)
      {
          if (!e.Delete)
          {
              notDeletedOrderFitters.Add(e);
          }
      }

然后:

int someInt = notDeletedOrderFitters.GroupBy(f => f.OrderFitter.Person).Count();

这行得通,但是有什么问题

.Where(f => f.Delete == false)

在第一个 linq 查询中。我也试过这个:

int someInt = orderEditorViewModel.EditOrderFitters.Where(f => !f.Delete).GroupBy(f => f.OrderFitter.Person).Count();

但列表再次没有被过滤

向大家道歉,我正在查看此 if 语句的 LHS 以测试列表中的重复条目,而我应该同时查看这两个条目

if (orderEditorViewModel.EditOrderFitters.Where(f => f.Delete == false).GroupBy(f => f.OrderFitter.Person).Count() < orderEditorViewModel.EditOrderFitters.Where(f => f.Delete == false).Count())

感谢您的回复和cmets! 我忘了把删除放在两边

【问题讨论】:

  • 是 EF 还是内存中的集合?
  • 循环应该和orderEditorViewModel.EditOrderFitters.Where(f =&gt; !f.Delete).ToList()完全一样。
  • 确实如此,我的错误,我已经编辑了问题。谢谢。

标签: c# linq


【解决方案1】:

我刚刚复制了你的情况,它给了我正确的结果,你可以检查直播here

using System;
using System.Linq;
// https://stackoverflow.com/questions/59702370/c-sharp-linq-groupby-query-ignoring-where-on-bool

public class Program
{
    public static void Main()
    {
        var orderEditorViewModel = new 
        {
            ParentName = "xyz",
            EditOrderFitters = new [] 
            {
                new EditOrderFitter { Delete = true, OrderFitter = new OrderFitter { Id = 1, Person = "1" } },

                new EditOrderFitter { Delete = false, OrderFitter = new OrderFitter { Id = 1, Person = "2" } },

                new EditOrderFitter { Delete = false, OrderFitter = new OrderFitter { Id = 1, Person = "2" } },

                new EditOrderFitter { Delete = false, OrderFitter = new OrderFitter { Id = 1, Person = "3" } }
            }
        };

        var result = orderEditorViewModel.EditOrderFitters.Where(f => !f.Delete).GroupBy(f => f.OrderFitter.Person);
        foreach(var item in result)
            Console.WriteLine("" + " Count: " + item.Count());

    }

    public class EditOrderFitter
    {

        public bool Delete { get; set; }
        public bool Added { get; set; }
        public OrderFitter OrderFitter { get; set; }
    }

    public class OrderFitter 
    {
        public int Id { get; set; }
        public string Person { get; set; }
    }

}

【讨论】:

  • 它有效,我的错误,我已经编辑了问题。谢谢!这帮助我睁开眼睛看到了错误。
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2023-03-10
  • 2012-09-18
  • 2012-12-29
相关资源
最近更新 更多