我有一张包含Branch Ids
和Department Ids
的表格。我有三个分支机构,第一个分支机构只有一个部门,第二个分支机构有两个部门,第三个分支机构有三个部门。
现在,我需要编写一个查询来查找具有部门1但没有部门的分支。 2和部门。 3.
这只是一个例子,我有一个非常动态的更复杂的场景。我正在用这个例子来提出我的问题。
我附上照片以了解问题。
以下是查询:
db.ConnectedBRDE.Where(x => x.DeptId == 1 && x.DeptId != 2)
.Select(x => x.BranchId)
.ToList();
这个查询给出了我的所有三个分支,而我只需要分支1,因为这是唯一没有部门2的分支。
我想这部分&& x.DeptId != 2
是错误的。我应该在这里写些什么来使我的过滤器工作?
答案 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))