会社ID(Guid
)を使用して、LINQを使用してローカルDataSet
の会社を検索する方法があります。データセットからのプロパティは、その場合に作成されるクラス(CompanyModel
)に格納されます。プロパティの1つはOrganizationNo
で、データセットにはLong
のタイプですが、はCompanyModel
です。データセットとLINQでnullを処理する
問題は、OrganizationNo
は、null
のデータセットになる可能性があります。これにより、ToString()
メソッドは例外をスローします。私はそれを修正しようとすることができます(下記参照)が、運がない。
複数行のコードやtry/catchの使用を必要としないシンプルで読みやすいソリューションがありますか?組織番号がnull
ある場合query
はnull
なるので
UPDATE
は例外は、以前の時点でスローされます。したがって、ToString()
が失敗することとは関係ありません。コードはそれほど遠くには及ばない。私は、(Throw Exception)
から(Null)
へのデータテーブルのOrganizationNo
のNullValue
プロパティを変更しようとしましたが、これは許可されていません。それは私たちが選択した悪いデザインですか、Long
を使用してプロパティがnullになることがありますか?
public void SelectCompany(Guid companyId)
{
SelectedCompany = new CompanyModel();
SelectedCompany.Id = companyId;
CompanyDataTabel dt = DataSet.Company;
// Look up the company in the company table in the data Set
var query = from company in dt.AsEnumerable()
where company.Id == companyId
select new
{
company.OrganizationNo,
company.Name,
company.PhoneNo,
company.Email,
};
// If the OrganizationNo is null, then the entire query is null.
// Hence the '.Count()' method will fail.
if (query.Count() != 1)
{
// One (and only one) company should match the organisation ID.
throw new ArgumentException("Multiple companies found.");
}
// These properties are never null and causes no issues
SelectedCompany.Name = query.First().Name;
SelectedCompany.PhoneNumber = query.First().PhoneNo;
SelectedCompany.EmailAddress = query.First().Email;
SelectedCompany.OrganisationNumber = query.First().OrganizationNo.ToString()
}
スローされた例外の完全なスタックトレースを表示するにはあなたの投稿を更新してください。 'Nullable'の 'T' = value型では' –
mjwills
'?.'が使用されますが、値型自体ではありません。だから、 'long?'では動作しますが、 'long'では動作しません。 –
問題は実際に早く発生します。これは 'OrganizationNo'が値' null'を許されていないことが原因です。 'OrganizationNo'があれば' query'はnullになります。私は私の質問を更新します。 – Noceo