Linq.DataQuery集合抛出异常;无法检查空值?

时间:2012-01-24 19:42:00

标签: c# linq linq-to-sql

我有一个LINQ to SQL查询,它生成一个{System.Data.Linq.DataQuery}类型的对象。我的问题是我在尝试确定列表是否为空(或为空)时遇到异常。

我尝试了各种不同的测试,并通过StackOverflow搜索了答案,但我尝试的任何内容都不会让我超越此异常:

  // I try to declare explicitly:
   IQueryable<DataAccess.Entities.CompanyProfile> carrierCodes = null;


  // and implicitly
         var carrierCodes = from cc in context.CompanyProfiles
                          where cc.ProfileTypeID == 9 &&
                                cc.CompanyProfileCode == shipTEntity.CargoControlNum.Substring(0, 3) &&
                                cc.CompanyProfileID == shipTEntity.CompanyProfile.CompanyProfileID
                          select cc;



        // VAROIUS NULL REF TESTS
        var _info = carrierCodes.FirstOrDefault( u => u != null); // fails

        int itemCount = Enumerable.Cast<string>(carrierCodes.DefaultIfEmpty()).Count(); // fails

       var InstanceCount = carrierCodes.Count(i => i != null); // fails

        foreach (var companyProfile in carrierCodes) // fails
        {
            if ( companyProfile != null )
                itemCount++;
        }

        var  exists = carrierCodes.DefaultIfEmpty().ToList(); // fails

        int count = exists.Count;

        return count > 0;

正如您所看到的,我尝试了FirstOrDefault,测试了null(如果是carrierCodes!= null),但每次都计算为false。我尝试以各种方式获取实例计数,但由于列表为null,因此在尝试测试计数时会给我一个例外。

令人困惑的是,carrierCode列表不为null,但它给出了Object Null引用异常。

PS这是一个例外:

 "Object reference not set to an instance of an object."

谢谢,

在西雅图感到困惑。

更新

我尝试过以下建议 - 它们都会产生与以前相同的异常。我附上了异常对话框和异常细节:

  var carrierCodes = from cc in context.CompanyProfiles
                           where cc.ProfileTypeID == 9 &&
                                 cc.CompanyProfileCode == shipTEntity.CargoControlNum.Substring( 0, 3 ) &&
                                 cc.CompanyProfileID == shipTEntity.CompanyProfile.CompanyProfileID
                           select cc;

         // the below all throw ex:
        var isValid = carrierCodes.Count() == 0;
        var isNull  = carrierCodes.FirstOrDefault() == null;

        if ( carrierCodes.ToList().Count == 0 )
        {
            //Don't try to access members of carrierCodes
        }

例外:

My Exception

更新代码:

     var code      = shipTEntity.CargoControlNum.Substring(0, 3);
        var profileId = shipTEntity.CompanyProfile.CompanyProfileID;

        var profiles = from cc in context.CompanyProfiles
                       where cc.ProfileTypeID == 9
                       select cc;

        var codesInProfiles = from p in profiles
                              where p.CompanyProfileCode == code
                              select p;

        var carrierCodes = from c in codesInProfiles
                        where c.CompanyProfileID == profileId
                        select c;

        //var carrierCodes = from cc in context.CompanyProfiles
        //                   where cc.ProfileTypeID == 9 &&
        //                         cc.CompanyProfileCode == shipTEntity.CargoControlNum.Substring( 0, 3 ) &&
        //                         cc.CompanyProfileID == shipTEntity.CompanyProfile.CompanyProfileID
        //                   select cc;

        if ( !profiles.Any() )
            return false;

        if ( !codesInProfiles.Any() )
            return false;

        if ( !carrierCodes.Any() )
            return false;

答案:问题是我的个人资料ID无效。 .Any()是Count()== 0 btw

的一个很好的替代品

3 个答案:

答案 0 :(得分:1)

根据我原来的评论,我猜测shipTEntity上使用过的相关实体之一未预先加载。可能特别是CompanyProfile

要解决此问题,在从数据上下文中检索shipTEntity时,您应该在上下文中设置一些DataLoadOptions.LoadsWith,以确保它的相关实体也从上下文中加载。

答案 1 :(得分:0)

如果您的查询未返回CompanyProfiles,则以下内容应为true

carrierCodes.Count() == 0;

carrierCodes.FirstOrDefault() == null;

要确定您的carrierCodes是空的还是nullpredicateCount()的{​​{1}}争论不再需要。

答案 2 :(得分:0)

试试这个:

var carrierCodes = from cc in context.CompanyProfiles
                       where cc.ProfileTypeID == 9 &&
                             cc.CompanyProfileCode == shipTEntity.CargoControlNum.Substring( 0, 3 ) &&
                             cc.CompanyProfileID == shipTEntity.CompanyProfile.CompanyProfileID
                       select cc;

if (carrierCodes == null) {
    return false; // or whatever
}

我认为你得到了异常,因为carrierCodes本身是null,所以当你试图对它执行操作(FirstOrDefault,Count)时,那些尝试在空对象上执行。