gpt4 book ai didi

c# - Linq to Entities 多对多连接

转载 作者:太空宇宙 更新时间:2023-11-03 11:29:05 25 4
gpt4 key购买 nike

我第一次使用 Entity Framework,所以我不确定我是否做对了。

我有 4 个表:

CustomerOrder
------------
ID, StaffID, DeptID, Status, other columns...

Staff
------------
StaffID, other columns...

StaffDept
------------
StaffID, DeptID - only 2 fields

Dept
------------
DeptID, other columns...

一个员工可以属于多个部门。 StaffDept 表就是用来存储这种多对多关系的。

我需要检索以下组合:

  • 所有状态为“进行中”
  • 的客户订单
  • 状态为“进行中”的当前员工的任何额外记录
  • 状态为“进行中”的任何额外记录,其中工作人员与客户订单属于同一部门。

例如,如果我有以下数据:

Staff
-----
1, Mr X, ...
2, Mr Y, ...

Dept
-----
1, Sales, ...
2, Marketing, ...

StaffDept
-----
1, 1
1, 2
2, 2

CustomerOrder
-----
1, 1, 1, In Progress, ...
2, 1, 1, Completed, ...
3, 2, 2, In Progress, ...
4, 2, NULL, In Progress, ...

我希望如果当前用户是#1,他们会看到客户订单 1、2、3。用户 #2 会看到 2、3、4。

这是我到目前为止的代码:

from co in CustomerOrders
where co.Status != "In Progress"
|| co.StaffID == @CurrentStaffID
|| (co.StaffID != @CurrentStaffID
&& co.DeptID!= null
&& Staffs.Where(x => x.StaffID == @CurrentStaffID).FirstOrDefault().Depts.Any(x => x.DeptID== co.DeptID))
select new CustomerOrderObject
{
Description = co.Description,
Amount = co.Amount,
...
}

这有效,但 Resharper 提示 FirstOrDefault() 部分将在运行时抛出 NULL 异常。我已经在 Linqpad 中使用 #3 的用户(不存在)进行了测试,它没有抛出错误 - 它只返回记录 2,这正是我所期望的。 Resharper 希望我将 Staffs.Where(x => x.StaffID == 3).FirstOrDefault() 拉到上面查询之前运行的单独查询中,但我认为这将使它更慢?我真的不确定这个查询中的任何一个都是获取数据的最快方法,因为我是 linq to entities 的新手,我一直在使用 linq-to-sql。任何建议将不胜感激 - 我什至不确定如何正确描述我正在尝试执行的连接类型。

最佳答案

由于您只是通过其主键检索 Staff 的成员,并且您知道该 ID 恰好会有一名员工,因此您应该替换 FirstOrDefault使用 Single

Staffs.Single(x => x.StaffID == @CurrentStaffID).Depts.Any(x => x.DeptID== co.DeptID))

编辑 1:

也许你可以稍微折叠一下你的查询:

StaffDept.Any(sd => sd.StaffId == @CurrentStaffID && sd.DeptID== co.DeptID)

编辑 2:

Staff.Any(x => x.StaffID == @CurrentStaffID && x.Depts.Any(d => d.DeptID == co.DeptID)

关于c# - Linq to Entities 多对多连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8425296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com