2017-02-08 54 views
1

我是LINQ的新手,我对如何在LINQ中编写IF ELSE有点困惑。如何编写多条件的LINQ

,我已经创建当前LINQ是:

lstRecord = (from a in lstPerson 
      select new GeneralCommonFunctions.MemberDetailSumary 
      { 
       AgeGroupId = a.AgeGroup_id!=null? a.AgeGroup_id.Value: 0, 
       AgeGroupText = a.Agegroup!=null?a.Agegroup.Description: "", 
      }).ToList(); 

现在我想获得从列表中DOB和计算基于今天的日期目前的年龄,然后将其归类到年龄组(当前版本直接从数据库中获取年龄段)。

可用年龄组是:

  • 低于25(ID为1)

  • 26-35(ID是2时)

  • 36-45(ID是3)

  • 46-55(ID是4)

  • 5 5及以上(ID被5)

例如,如果构件是DOB 1990年1月15日,他属于agegroup 2. 如果构件是DOB一九七〇年十二月二十日,他是属于agegroup 4.

我stucked在此编码:

lstRecord = (from a in lstPerson 
      select new GeneralCommonFunctions.MemberDetailSumary 
      { 
       Age = DateTimeUtility.GetCurrentAge(a.Dob), 
       //I dont know how to continue in this part, my idea is if the age is 0-25, the agegroup_id is 1, if the age is 30, the agegroup_id is 2. 

}).ToList(); 

是你有人能帮助我吗?谢谢 !

UPDATE:

我有更新的想法使用LINQ当按钮点击所有行。例如,用户点击一个按钮,然后系统会检查每个人的DOB,然后在数据库中更新他们的年龄组。

例如,如果人物A DOB是1990-01-01,他/她的agegroup将自动更新为2,如果人物B DOB是1970年5月15日,他/她的agegroup将更新至4

如何编写一个linq来更新数据库中的所有行? 谢谢你的帮助!

+0

好吧,我不会试图写有嵌套条件运营商所有的逻辑。只需编写一个计算年龄的方法来检查它所在的乐队并返回相应的ID。 – juharr

+0

你最好只是在你的数据库中添加计算列:https://technet.microsoft.com/en-us/library/ms191250(v=sql.105).aspx – MarcinJuraszek

回答

1
lstRecord = (from a in lstPerson 
      select new GeneralCommonFunctions.MemberDetailSumary 
      { 
       Age = DateTimeUtility.GetCurrentAge(a.Dob), 
       AgeGroupID = GetAgeGroup(a.Dob); 

}).ToList(); 

您可以创建方法GetAgeGroup,其中您将给出当前的出生日期。从你的解释a.DobDateTime。之后,你计算的是人的年龄,并把正确的AgeGroupID

public int GetAgeGroup(DateTime birthYear) 
{ 
    //here you can reuse your method DateTimeUtility.GetCurrentAge(a.Dob), 
    // I just wrote the logic because I'm not sure if it is correct. 
    int age= DateTime.Now.Years - birthYear.Years; 

    if (birthYear > DateTime.Now.AddYears(-years)) 
     age--; 

    if(age<=25) 
     return 1; 
    else if(age> 25 && age<=35) 
     return 2; 
    else if(age> 35 && age<=45) 
     return 3; 
    else if(age> 45 && age<= 55) 
     return 4; 
    else if(age> 55) 
     return 5 
    else 
     return -1; // this will represent invalid age 
} 
+0

谢谢你的建议,但我有另一个这个想法是更新表'person'中的数据库agegroup_id列。例如,当系统启动时,数据库运行一个linq,它会根据当前日期自动更新所有行。我已经写了计算来根据今天的日期计算当前的年龄。但你能教我如何更新表'人'中的多行吗?我会在上面的问题中写更多的细节。非常感谢你! @mybirthname – chonglt

+0

这段代码很奇怪......你为什么要检查当你已经检查25岁以下的年龄是否超过25岁? '如果(年龄<= 25) 返回1; else if(age <= 35) return 2; else if(age <= 45) return 3; else if(age <= 55) return 4; else return 5' – Hogan

1
lstRecord = (from a in lstPerson 
     select new GeneralCommonFunctions.MemberDetailSumary 
     { 
      Age = DateTimeUtility.GetCurrentAge(a.Dob), 
     }).Select(t=>new GeneralCommonFunctions.MemberDetailSumary{ 
         Age=t.Age, 
         AgeGroupID = t.Age<=25?1:t.Age<=35?2:t.Age<=45?3:t.Age<=55?4:5, 
        }).ToList(); 
+0

感谢您的建议,但我还有一个想法是更新表'person'中的数据库agegroup_id列。例如,当系统启动时,数据库运行一个linq,它会根据当前日期自动更新所有行。我已经写了计算来根据今天的日期计算当前的年龄。但你能教我如何更新表'人'中的多行吗?我会在上面的问题中写更多的细节。非常感谢你! @Rick – chonglt

+0

你在这段代码中使用了哪个ORM?EF或Linq2sql?foreach(lstRecord中的var p){p.AgeGroupID = 1?2?3 ...} db.SubmitChanges();(Linq2Sql),ctx.SaveChanges ();(EF) – Rick

+0

如果表'人的数据很大,那么这不是一个好主意。这只是我的建议。 – Rick