首页 > 解决方案 > 如果列表为空,linq 将返回 null 异常

问题描述

我面临的一个挑战是,我正在使用 LINQ 使用 Take 方法获取前 5 条记录,但如果列表为空,则它会引发以下异常:

无法将类型 'System.Nullable`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' 类型转换为 'System.Object'。LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

所以请指导我如何解决它。

下面我提供我的示例代码

openTickets_Result = (from tic in db.Tickets1
                      join com in db.Company on tic.company_id equals com.id
                      join bra in db.Branch on tic.branch_id equals bra.id
                      join use in db.Users on tic.assinged_to equals use.Id
                     where companyIds.Any(x => x.Equals((long)tic.company_id)) 
                     && branchIds.Any(x => x.Equals(tic.branch_id))
                     && tic.status == "Open"
                     && tic.priority == "High"
                      select new Details {
                           Assinged_To = use.FullName,
                           Company_Name = com.name,
                           Branch_Name = bra.branch_name,
                           ticketName=tic.Name
                      }).OrderBy(x => x.Create_Date).Take(5).ToList();

如果列表有时是 ,则 Take 方法会给出异常empty/null

标签: c#asp.net-mvcentity-frameworklinq

解决方案


因为branchIds是 long 非空类型,x => x.Equals(tic.branch_id)而这里 tic.branch_id 是 long null 类型,所以需要对其进行类型转换

openTickets_Result = (from tic in db.Tickets1
                      join com in db.Company on tic.company_id equals com.id
                      join bra in db.Branch on tic.branch_id equals bra.id
                      join use in db.Users on tic.assinged_to equals use.Id
                      where companyIds.Any(x => x.Equals((long)tic.company_id)) && branchIds.Any(x => x.Equals((long)tic.branch_id)) && tic.status == "Open" && tic.priority == "High"
                      select new LiveTickets
                      {
                          Assinged_To = use.FullName,
                          Company_Name = com.name,
                          Branch_Name = bra.branch_name,
                          ticketName=tic.Name
                      }).OrderBy(x => x.Create_Date).Take(5).ToList();

无论如何感谢大家的支持。


推荐阅读