使用数据集和LINQ处理null

时间:2017-09-18 07:41:26

标签: c# .net linq

我有一个方法,它使用LINQ在本地DataSet中使用公司ID(Guid)查找公司。然后将数据集中的属性存储在为该场合创建的类(CompanyModel)中。其中一个属性是OrganizationNo,其在DataSet中的类型为Long,但在String中为CompanyModel

问题是,OrganizationNo可以是DataSet中的null。这会导致ToString()方法抛出异常。我可以尝试修理它(见下文),但没有运气。

是否有某种简单易读的解决方案,不需要多行代码和/或使用try / catch?

更新

如果组织编号为query,则会在较早的时候抛出异常,因为null变为null。因此它与ToString()失败无关。代码永远不会那么远。我尝试将数据表中NullValue的{​​{1}}属性从OrganizationNo更改为(Throw Exception),但这是不允许的。这是一个我们选择的糟糕设计,使用(Null)作为有时为null的属性吗?

Long

4 个答案:

答案 0 :(得分:1)

你可以检查OrganisationNumber属性必须定义Nulable .. Nulable<long>long?这样public long? OrganisationNumber {get;set;}

SelectedCompany.OrganisationNumber = string.Empty;

if(query.First() != null && query.First().OrganizationNo.HasValue)
{
   SelectedCompany.OrganisationNumber = 
    query.First().OrganizationNo.Value.ToString();
}

SelectedCompany.OrganisationNumber = query.First() != null && query.First().OrganizationNo.HasValue ?  "" : "";

SelectedCompany.OrganisationNumber = 
query.First() != null ? query.First().OrganizationNo?.ToString() ?? string.Empty : string.Empty;

答案 1 :(得分:1)

您的查询中的问题是您使用强类型DataSet,如果您尝试访问null的属性,则会引发错误。为了处理这种情况,DataSet会自动添加一个bool方法,您必须在访问该nullable-column属性之前检查该方法。但是您的查询会创建一个匿名类型,无需进行此检查即可访问此可空属性。因此,当执行query.First()时的查询时,您将获得异常。

请改用此查询:

var query = from company in dt.AsEnumerable()
            where company.Id == companyId
            select new
            {
               OrganizationNo = company.IsOrganizationNoNull()
                                ? string.Empty 
                                : company.OrganizationNo.ToString(),
               company.Name,
               company.PhoneNo,
               company.Email,
            };

侧面说明:

而不是if (query.Count() != 1),您应该使用Single

var company = query.Single(); // throws a desired exception if there are no or more than two records
SelectedCompany.Name = company.Name;
SelectedCompany.PhoneNumber = company.PhoneNo;
SelectedCompany.EmailAddress = company.Email;
SelectedCompany.OrganisationNumber = company.OrganizationNo;

它处理没有或多于一个的情况,并将在两种情况下抛出此异常。它的效率更高,因为您只需要执行一次查询。顺便说一句,所有query.First()次调用都必须再次执行整个查询

答案 2 :(得分:0)

long类型变量本身不能为null。但是Nullable<long>可以

答案 3 :(得分:0)

?.运算符适用于null,适用于引用类型或可空值类型,但不适用于normal值类型long