【问题标题】:LINQ Query to filter Data?LINQ查询过滤数据?
【发布时间】:2018-04-04 12:22:12
【问题描述】:

我有一个包含Branch IdsDepartment Ids 的表。我有3个分行,第1个分行只有1个部门,第2个分行有2个部门,第3个分行有3个部门。

现在,我需要编写一个查询来查找具有部门 1 但没有部门的分支机构。 2和部门3.

这只是一个例子,我有一个更复杂的场景,它非常动态。我正在使用这个例子来提出我的问题。

我附上图片来理解问题。

这里是查询:

db.ConnectedBRDE.Where(x => x.DeptId == 1 && x.DeptId != 2)
                .Select(x => x.BranchId)
                .ToList();

这个查询给出了我所有的三个分支,而我只需要分支 1,因为这是唯一没有部门 2 的分支。

这部分&& x.DeptId != 2 是错误的,我猜。我应该在这里写什么来使我的过滤器工作?

【问题讨论】:

  • 您是否将 Branches 和 Departments 都放在一个表中?
  • 这是一个包含BranchIdDepartmentId 的桥接表。
  • @HüseyinBurakKaradag,完全不一样 :)
  • 我所能做的就是为您在问题中陈述的内容提供一个解决方案 - 我不知道您的非常复杂且非常动态的场景是什么:)
  • 是的,我做到了。我试过你的技术分开做,它奏效了。

标签: c# asp.net-mvc entity-framework linq filter


【解决方案1】:

Stephen Muecke 的评论确实有效。

我已经在DotNetFiddle 测试过了。

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main(string[] args)
    {

        List<TestClass> lstOfItems = new List<TestClass>();

        var itemOne = new TestClass(){BranchName = "Branch One", BranchId = 1, DeptId = 1};
        var itemTwo = new TestClass(){BranchName = "Branch Two", BranchId = 2, DeptId = 1};
        var itemThree = new TestClass(){BranchName = "Branch Two", BranchId = 2, DeptId = 2};
        var itemFour = new TestClass(){BranchName = "Branch Three", BranchId = 3, DeptId = 1};
        var itemFive = new TestClass(){BranchName = "Branch Three", BranchId = 3, DeptId = 2};
        var itemSix = new TestClass(){BranchName = "Branch Three", BranchId = 3, DeptId = 3};

        lstOfItems.Add(itemOne);
        lstOfItems.Add(itemTwo);
        lstOfItems.Add(itemThree);
        lstOfItems.Add(itemFour);
        lstOfItems.Add(itemFive);
        lstOfItems.Add(itemSix);

        var myList = lstOfItems.GroupBy(x => x.BranchName).Where(y => y.Count() == 1 && y.First().DeptId == 1).ToList();

        foreach(var item in myList){
            Console.WriteLine(item.Key);
        }

        // Output
        // Branch One

    }
}

public class TestClass
{
    public string BranchName {get;set;}
    public int BranchId {get;set;}  
    public int DeptId {get;set;}
}

基本上,一旦所有记录都按BranchName 属性分组,那么我们要计算每个分支名称下的所有记录.. 如果计数等于1,则意味着分支只有@987654325 @record.. 然后我们找到该记录的DeptId,如果它等于1,则满足您的条件。

【讨论】:

    【解决方案2】:

    我认为下面的代码就是你要找的东西

    var list = new List<Model>();
    list.Add(new Model(1, 1));
    list.Add(new Model(2, 1));
    list.Add(new Model(2, 2));
    list.Add(new Model(3, 1));
    list.Add(new Model(3, 2));
    list.Add(new Model(3, 3));
    
    var notValidBranchIds = list.Where(x => x.DeptId == 2 || x.DeptId == 3).Select(x => x.BranchId);
    var result = list.Where(x => x.DeptId == 1 && !notValidBranchIds.Contains(x.BranchId)).Select(x => x.BranchId);
    
    // you can also use this. It solve the problem in a line
    var betterResult = list.GroupBy(x => new { x.DeptId })
       .Select(x => x.FirstOrDefault(a => a.DeptId == 1))
       .Where(y => y != null)
       .ToList();
    

    只返回第一个 branchId 的记录。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      如果您可以访问 Branch 和 Department 模型,我建议使用此查询:Branches.Where(b=&gt;b.Departments.All(d=&gt;d.Id != 2) &amp;&amp; b.Departments.Any(d=&gt;d.Id==1))

      【讨论】:

        猜你喜欢
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多