実行する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
ZipCode | GovCode | Pref | City | Town |
2720004 | 12203 | 千葉県 | 市川市 | 原木 |
これを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>
コメント