我有2个表格,我希望匹配2个Id值。
第一张表
第二张表
我想将第一张桌子的Id与第二张桌子的Id匹配,这样我就可以得到DepartmentId值。
我需要获得这个虚拟结果:
这是我的代码:
for (int i = 0; i < model1.Count(); i++)
{
model1[i].DepartmentId= model2.FirstOrDefault(k => k.Id== model1[i].Id).DepartmentId;
}
我收到此错误:
发生了'System.NullReferenceException'类型的异常 IYP.UserInterfaceLayer.dll但未在用户代码中处理
我认为循环失败是因为它无法找到10,30,40 Id值。如果我的Id值在2个表中相同(Id = 1,2,3,4,5),则循环工作。
我如何使用Linq执行此操作?
答案 0 :(得分:2)
你基本上是在寻找LINQ中的Left Join。试试这个: -
var query = from emp2 in Employee2
join emp1 in Employee1
on emp2.Id equals emp1.Id into allEmployees
from result in allEmployees.DefaultIfEmpty()
select new
{
ID = emp2.Id,
DeptID = result == null ? "No Department" : result.DepartmentId.ToString()
};
我使用了以下类型: -
var Employee1 = new[]
{
new { Id = 1, DepartmentId = 2 },
new { Id = 2, DepartmentId = 4 },
new { Id = 3, DepartmentId = 5 },
new { Id = 4, DepartmentId = 2 },
new { Id = 5, DepartmentId = 1 },
};
var Employee2 = new[]
{
new { Id = 1 },
new { Id = 2 },
new { Id = 10 },
new { Id = 30 },
new { Id = 40 },
};
完成工作Fiddle。
答案 1 :(得分:1)
我将假设model1和model2都是IEnumerable。在这种情况下,以下情况应该有效。
var result = from x in model2
select
new Model1Type {DepartamentId = x,
Value=
model1.FirstOrDefault(y=>y.DepartamentId==x)
.Select(y=>y.Value)};
这叫做Lamq:D 希望这会有所帮助:)
答案 2 :(得分:1)
您应该使用 Join LINQ扩展方法。以查询语法的形式(我相信在这种情况下更具可读性)它看起来像:
var matchedValues =
from second in model2
join first in model1
on second.Id equals first.Id
into temp
from tempFirst in temp.DefaultIfEmpty()
select
new
{
second.Id,
DepartmentId = tempFirst == null ? null : tempFirst.DepartmentId
};
您加入 Id 属性,对于您在 model1 中找不到的任何值,您使用默认值( DefaultIfEmpty 打电话)。然后根据连接结果选择生成的 DepartmentId 。
答案 3 :(得分:1)
试试这个
List<long> idlist=model2.tolist().select(t=>t.Id);
List<long> depIdList=model1.where(t=>idlist.contains(t.id)).toList();