郵便番号から住所を検索する

実行するSQLはこんな感じ。

SELECT
    m.zip_code AS ZipCode
    , m.gov_code AS GovCode
    , m0.pref AS Pref
    , m0.city AS City
    , m.town AS Town 
FROM
    mst_zip AS m 
    INNER JOIN mst_city AS m0 
        ON m.gov_code = m0.gov_code 
WHERE
    m.zip_code = 2720004
ZipCodeGovCodePrefCityTown
272000412203千葉県市川市原木
実行結果

これをEFで書くとこうなる。

// 郵便番号検索
using (var lc = new LearnContext())
{
    var result = lc.MstZips.Join(
        lc.MstCities,
        p => p.GovCode,
        c => c.GovCode,
        (p, c) => new
        {
            p.ZipCode,
            p.GovCode,
            c.Pref,
            c.City,
            p.Town
        })
        .Where(x => x.ZipCode == VM.ZipCode)
        .ToList();

    // ドロップダウンリスト更新
    VM.ComboTownItems.Clear();
    foreach (var item in result)
    {
        VM.ComboTownItems.Add(item);
    }

    // フィールドをクリア
    VM.Pref = string.Empty;
    VM.City = string.Empty;
    VM.Town = string.Empty;

    // 検索結果が0の場合終了
    if (result.Count == 0)
    {
        return;
    }

    // フィールドを設定
    VM.Pref = result[0].Pref;
    VM.City = result[0].City;
    if (result.Count() == 1)
    {
        VM.Town = result[0].Town;
    }
}

戻り値resultの型はこうなる。

System.Collections.Generic.List<<>f__AnonymousType1>

匿名クラスのリストだね。結合結果のEntityクラスを定義して指定してもいいし、面倒ならば特に指定しないでもそのまま使えてラクチン。

取得した値をViewModelのプロパティに設定するとViewに反映される。コンボボックスのドロップダウンリストも同様。

動作としてはヒットなしの時はクリアして終了。1件以上ヒットしたときは都道府県および市区町村についてはテキストボックスに表示する。

町域名をドロップダウンリストに追加して町域名を選択可能にする。ヒット数が1件のみの場合は町域名も表示する。

実行結果

XAMLはこんな感じ。数値7桁入力した場合はハイフンを入れるようにしているがこれの詳細はここ。また、有効な郵便番号を入力した場合のみ検索ボタンを押せるようにしているが、詳細はこちら

<Window x:Class="AddressBook.EditWindow"
        xmlns:cnv="clr-namespace:AddressBook.converter"
        xmlns:val="clr-namespace:AddressBook.validator"
    <Window.Resources>
        <cnv:ZipConverter x:Key="ZipConverter"/>
    </Window.Resources>

<TextBox x:Name="textZip" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2" Margin="4,4,4,4">
    <TextBox.Text>
        <Binding Converter="{StaticResource ZipConverter}" Path="ZipCode" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <val:ZipValidationRule ValidatesOnTargetUpdated="True"/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

トップページ

コメント

タイトルとURLをコピーしました