我有一个方法,它使用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
答案 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
。