我有一个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
}
例外:
更新代码:
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
的一个很好的替代品答案 0 :(得分:1)
根据我原来的评论,我猜测shipTEntity
上使用过的相关实体之一未预先加载。可能特别是CompanyProfile
。
要解决此问题,在从数据上下文中检索shipTEntity
时,您应该在上下文中设置一些DataLoadOptions.LoadsWith,以确保它的相关实体也从上下文中加载。
答案 1 :(得分:0)
如果您的查询未返回CompanyProfiles
,则以下内容应为true
:
carrierCodes.Count() == 0;
和
carrierCodes.FirstOrDefault() == null;
要确定您的carrierCodes
是空的还是null
,predicate
和Count()
的{{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)时,那些尝试在空对象上执行。