2017-09-18 17 views
0

会社ID(Guid)を使用して、LINQを使用してローカルDataSetの会社を検索する方法があります。データセットからのプロパティは、その場合に作成されるクラス(CompanyModel)に格納されます。プロパティの1つはOrganizationNoで、データセットにはLongのタイプですが、はCompanyModelです。データセットとLINQでnullを処理する

問題は、OrganizationNoは、nullのデータセットになる可能性があります。これにより、ToString()メソッドは例外をスローします。私はそれを修正しようとすることができます(下記参照)が、運がない。

複数行のコードやtry/catchの使用を必要としないシンプルで読みやすいソリューションがありますか?組織番号がnullある場合querynullなるので

UPDATE

は例外は、以前の時点でスローされます。したがって、ToString()が失敗することとは関係ありません。コードはそれほど遠くには及ばない。私は、(Throw Exception)から(Null)へのデータテーブルのOrganizationNoNullValueプロパティを変更しようとしましたが、これは許可されていません。それは私たちが選択した悪いデザインですか、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() 

} 
+0

スローされた例外の完全なスタックトレースを表示するにはあなたの投稿を更新してください。 'Nullable 'の 'T' = value型では' – mjwills

+0

'?.'が使用されますが、値型自体ではありません。だから、 'long?'では動作しますが、 'long'では動作しません。 –

+0

問題は実際に早く発生します。これは 'OrganizationNo'が値' null'を許されていないことが原因です。 'OrganizationNo'があれば' query'はnullになります。私は私の質問を更新します。 – Noceo

答えて

1

クエリの問題は、nullというプロパティにアクセスしようとすると、エラーがスローされる強く型付けされたDataSetを使用していることです。その場合、DataSetは、nullable-columnプロパティにアクセスする前にチェックする必要があるboolメソッドを自動的に追加します。しかし、あなたのクエリは、このチェックなしでこのnullableプロパティにアクセスする匿名型を作成します。そのため、クエリが実行されたときに例外が発生します。これは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; 

は、これは何も存在しない場合を扱いますまたは2つ以上の場合にこの例外をスローします。一度クエリを実行するだけで済むので、効率的です。 Btw、すべてのquery.First()呼び出しが再度クエリ全体を実行する必要があります

+0

'.IsOrganizationNoNull'を実装しようとするとコンパイル時にエラーが発生します:"メソッドグループ 'IsOrgnizationNoNull'を非代理人 'bool'に変換できません。メソッドを呼び出すつもりでしたか? – Noceo

+0

私は気が狂っているでしょう、それは今働きます。ありがとうございました :-)。私はいくつかの小さなエラーがあったので、あなたのコードでいくつかの編集を行った。 – Noceo

0

long型の変数自体はnullにできません。しかしNullable<long>は、あなたがOrganisationNumberプロパティを確認することができます

1

があることができ、この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; 
+0

私の答えを見てください。データテーブルの 'OrganizationNo'カラムには、' NullValue:(例外を投げてください) 'というプロパティがあります。 'DefaultValue:'もあります。これは説明の一部かもしれませんが、私はそれをどうしたらいいのでしょうか? – Noceo

+0

DataTable列AllowDBNull = trueを設定しました。 –

+0

プロパティ 'AllowDBNull'は' true'に設定されていますが、それは問題ではないようです。 'OrganizationNo'が' null'のとき、クエリ全体が 'null'になります(元の投稿の更新を参照)。 – Noceo

0

ようNulable .. Nulable<long>またはlong?を定義する必要があります?.演算子はnullで動作します。これは参照型またはnull可能な値型で動作しますが、longのようなnormal値型では機能しません。

関連する問題