2009-03-16 13 views
7

データベースには、Contactというテーブルがあります。ファーストネームやその他のそのような文字列フィールドは、私のデータベースデザインではなくCharデータ型を使用するように設計されています。私のオブジェクト連絡先は、プロパティの文字列型にマップします。私はidでContactオブジェクトを取得する簡単なテストをやってみたかった場合、私はこのようなものだろう:Linqを使ってSqlに値をトリムする方法は?

Contact contact = db.Contacts.Single(c => c.Id == myId); 
Contact test = new Contact(); 
test.FirstName = "Martin"; 

Assert.AreEqual(test.FirstName, contact.FirstName); 

をcontact.FirstName値があるため、char型の「マーチン」です。 FirstNameプロパティがロードされているとき、どこで傍受できますか? OnFirstNameChanging(文字列値)は初期ロード(連絡先)で呼び出されるのではなく、テストオブジェクトで呼び出されます。

答えて

8

おそらく、OnLoaded()の部分メソッドに入れることができますか?注:私はこれを使用したことはありませんが、これは次のようになります:

public partial class Contact 
{ 
    partial void OnLoaded() 
    { 
     FirstName = FirstName.Trim(); 
    } 
} 
+0

これは動作します。私は表示するために多くのフィールドを表示していないので、各フィールドではかなり簡単です。ありがとう。 – Marsharks

+0

これは、プロパティ変更されたイベント(他のアクションを引き起こす可能性がある)を生成し、内容を意味の変更を加えずにプロパティの値を変更しているため、データベースを不必要に更新する可能性があります。 – tvanfosson

+3

質問のポイントは、このようなロジックを行う場所を見つけることでした(この場合はOnLoaded())。メソッド自体は、 "_FirstName = _FirstName.Trim();"というように簡単に構成できます。変更されたイベントの発射が適切に行われないようにします。 –

1
Contact contact = db.Contacts.Single(c => c.Id.Trim() == myId); 

LINQプロバイダがそれを適切なSQLに変換することを確認します。

+0

私は問題がIdフィールドではなかったと思います。 – tvanfosson

+1

@tvanfosson - 私は、この作戦は文字通りではなく、単なる例であると考えています。 –

6

スキーマを変更できない場合は、デザイナーにアクセサーをprivate/protectedで作成させ、部分クラス実装でプロパティをフロントエンドするパブリックアクセサーを作成することができます。 getアクセサの値をトリムすることができます。

public partial class Contact 
{ 

    public string RealFirstName 
    { 
     get { return this.FirstName.Trim(); } 
     set { this.FirstName = value; } 
    } 

    ... 
} 
+1

フィールドはchar型であるだけでなく、First_Nameとも呼ばれるため、これは良い解決策です。オブジェクトデザイナーで変更することなく、すべてのフィールドを修正することもできます。 – Marsharks

+0

問題は、クエリを作成し、FullName = c.FirstName + '' + c.LastNameのようなものを使用しようとするときです。私は式を変換できませんでしたし、ローカル式メッセージとして扱うことができませんでした。 – Marsharks

+0

フィルタリングを済ませたら、ToList()を使用して実際のクエリを生成し、結果のリストで選択を行うことができます。その時点ではオブジェクトなので、FullNameの構築は機能するはずです。 – tvanfosson

0

あなたはマーティンを検索しようとする前に、連絡先のリストにForEachを実行することができます。

var contacts = db.Contacts.ForEach(c => c.FirstName = c.FirstName.Trim()); 
Contact contact = contacts.Single(c => c.Id == myId); 
contact.FirstName // = "Martin" 

しかし、この方法は、それが複数のフィールドのために行わなければならない場合を維持することは非常に簡単ではありません。

+0

連絡先が100,000人の場合はどうなりますか? –

1

これは、スキーマとコードに対するコントロールによって異なります。

すべてのパラメータでコンストラクタを呼び出して値を設定している場合は、メンバー変数に割り当てられているトリムなどを行います。

プロパティに割り当てられている場合(おそらく例の場合)、SETアクセサを変更してそこでトリムするようにします。

実際に何らかのポイントで先頭または末尾のスペースが必要な場合は、潜在的な問題があります。

基本クラスコードを変更できない場合は、部分クラスを使用するか、クラスを継承してプロパティをオーバーライドしてみてください。

私の最後の提案は、あなたが作成したオブジェクトを渡す何らかの種類のファクトリクラスを書くことです。そして、それはあなたが望む規則に従ってそれをクリーンアップします。

関連する問題