LINQ查询过滤数据?

时间:2018-04-04 12:22:12

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

我有一张包含Branch IdsDepartment Ids的表格。我有三个分支机构,第一个分支机构只有一个部门,第二个分支机构有两个部门,第三个分支机构有三个部门。

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

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

我附上照片以了解问题。

enter image description here

以下是查询:

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

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

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

3 个答案:

答案 0 :(得分:2)

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则表示该分支只有1记录..然后我们找到该记录的DeptId,如果它等于1那么那就满足了你的条件。

答案 1 :(得分:1)

我认为下面的代码是你在找什么

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的记录。

希望对你有所帮助。

答案 2 :(得分:0)

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