如何设置不同表列的值?

时间:2014-12-23 15:25:17

标签: linq lambda

我有2张桌子。

第一张表的架构:

  • UserId:11,ReportId = 1400
  • UserId:25,ReportId = 1510
  • UserId:30,ReportId = 1518
  • UserId:41,ReportId = 1550
  • UserId:50,ReportId = 1590

第二张表的架构:

  • UserId:50,ReportId = 1400,DeptId = 10
  • UserId:80,ReportId = 1510,DeptId = 10
  • UserId:20,ReportId = 1518,DeptId = 10
  • UserId:41,ReportId = 1550,DeptId = 10
  • UserId:50,ReportId = 1590,DeptId = 10
  • UserId:60,ReportId = 1525,DeptId = 10
  • UserId:90,ReportId = 1526,DeptId = 10
  • UserId:50,ReportId = 1410,DeptId = 10
  • UserId:50,ReportId = 1489,DeptId = 10
  • UserId:50,ReportId = 1327,DeptId = 10

我需要将第一个表的UserId更改为第二个表的UserId,其中ReportId是相同的。

我的意思是:

  • UserId: 50 ,ReportId = 1400
  • UserId: 80 ,ReportId = 1510
  • UserId: 20 ,ReportId = 1518
  • UserId: 41 ,ReportId = 1550
  • UserId: 50 ,ReportId = 1590
List<FirstTable> tableFirst = new List<FirsTable>();
tableFirst = FirstTableBL.GetAll();

List<SecondTable> tableSecond= new List<SecondTable>();
tableSecond= SecondTableBL.GetAll();

for (int i = 0; i < tableSecond.Count(); i++)
{
    tableSecond[i].UserId= tableFirst.FirstOrDefault(k => k.ReportId== tableSecond[i].ReportId).UserId;
}

但是我得到一个Null定义错误,因为tableSecond没有tableFirst的所有值。

这种情况的正确linq表达式是什么?

2 个答案:

答案 0 :(得分:2)

单向,使用DefaultIfEmpty

tableSecond[i].UserId= tableFirst
    .Where(k => k.ReportId== tableSecond[i].ReportId)
    .Select(k => k.UserId)
    .DefaultIfEmpty(new Nullable<int>())  // replace as desired
    .First();

答案 1 :(得分:1)

FirstOrDefault如果找不到任何内容,将返回null。您应该在代码中进行空检查,然后继续:

for (int i = 0; i < tableSecond.Count(); i++)
{
  var fromTableFirst = tableFirst.FirstOrDefault(k => k.ReportId == tableSecond[i].ReportId)

  if(fromTableFirst != null)
      tableSecond[i].UserId = fromTableFirst.UserId;
}