私は、アドレスを格納するテーブルを持っています。このテーブルには、住所番号、住所の名前、方向、接尾辞、接頭辞、市区町村、州、および郵便番号などの住所コンポーネント用の複数のフィールドがあります。 (:この住所表には、以前にユーザーが追加した住所がありますが、同じ町、都道府県、国から来ると思われますので、都市、州、国、クエリ)。類似のアドレスを見つけるためのLINQクエリ
私のアプリケーションは、データベースにユーザが入力したアドレスと正確に一致するものを見つけることです。完全一致がない場合は、同様のアドレスを返します。
1234 N Johnson St、1234 North Johnson St、1234 North John Streetなどの不一致を避けるため、Google Map APIによって正規化された、ユーザーが入力した、またはデータベースに格納されたすべてのアドレス。
これは私が使用している完全一致のクエリです。ストアドアドレスと入力アドレスの両方がGoogle Address APIによって正規化されているので、私は欲しいものと完全に一致した結果を得ます。
var exactMatch = (from address in db.Addresses
where address.PrimaryAddressNumber == userInput.Number && address.Directional == userInput.Direction && address.Suffix == userInput.Suffix && address.StreetName == userInput.StreetName
select new IncidentSite
{
FullAddress = 'address components goes here'
});
ただし、完全一致がない場合は、ユーザーにオプションを提示します。私が考えている限り、複数のクエリを作成して組み合わせることです。期待どおりに動作しますが、時間がかかりすぎます。あなたはsimilarAdddress
で見たよう
私は
private IQueryable<IncidentSite> GetSimilarAddress(UserInput userInput)
{
var numberDirectionStreetname = (from address in db.Addresses
where address.PrimaryAddressNumber == userInput.Number && address.Directional == userInput.Direction && address.StreetName == userInput.StreetName
select new IncidentSite
{
FullAddress = 'address components goes here'
});
var numberStreetname = (from address in db.Addresses
where address.PrimaryAddressNumber == userInput.Number && address.StreetName == userInput.StreetName
select new IncidentSite
{
FullAddress = 'address components goes here'
});
var streetname = (from address in db.Addresses
where address.StreetName == userInput.StreetName
select new IncidentSite
{
FullAddress = 'address components goes here'
});
var similarAddress = numberDirectionStreetname.Union(numberStreetname).Union(streetname);
return similarAddress;
}
のようにやって、それは1件の結果を構築するために3つのdbo.Addresses
テーブルからのクエリが異なるwhere
声明で、その後、union
すべての3つの結果を実行します。
私がやっていることは、同様のアドレスを見つけるよりスマートな方法ではないと思います。はるかにシンプルで効率的なクエリを構築する良い方法はありますか?
EDIT: なぜ私は3つの異なるクエリを持つ必要があるのか分かりませんでした。その理由は、すべての可能な結果をユーザーに提供するためです。より詳細な説明をするには、下記をご覧ください。
ユーザーが「1234 North Johnson St」を検索し、完全一致が返されない場合は、以下の手順を実行します。
まず、numberDirectionStreetnameは、すべてのアドレスが「1234 North Johnson」と一致するものを選択します。その結果は1234 North Johnson + Boulevard/Street/Court/Way/Parkway /などになります。後続のものよりも一致するアドレスコンポーネントが存在するので、リストの先頭に表示します。
次に、numberStreetnameは、 '1234 Johnson'と一致するすべてのアドレスを選択します。結果は1234 +南/北/東/西/ etc + Johnson + Boulevard/Street/Court/Way/Parkway/etcになります。
3番目のstreetnameは、 'Johnson'と一致するすべてのアドレスを選択します。結果は9999 + South/North/East/West/etc + Johnson + Boulevard/Street/Court/Way/Parkway/etcになります。
可能であれば、1つの質問でそれを行いたいと思います。これは私の質問の一部でもあり、速く実行するだけでなく、簡単にすることもできます。しかし、それは3つの別々のクエリでなければなりません。どのようにそれらを注文しますか?そして私の論理が理想的でないなら、あなたはどのように示唆しますか?
あなたの編集ごとに - あなたは十分にはっきりしていた。提供された住所のいずれかの部分に一致する住所を検索したい場合は、結果の上位に注文されたほとんどの部分に一致する住所が必要です。このために3つの個別のクエリは必要ありません。 1つのクエリでこれを達成する方法については、私の答えを参照してください。ちなみに、あなたがそれを求めていないにもかかわらず、あなたがいくつかの部分のマッチングを他のものよりも重要にしたいなら、あなたはその部分のランク付けを重み付けする必要があります。 –
ありがとう!私はあなたの答えを読んで、私が計画したとおりにそれを実行させるために私のプロジェクトに取り組んでいます。私はあなたが私の質問を理解していることを知っていたが、他の人が尋ねたので詳細を追加しなければならなかった。 –
うれしかったのでうれしいです。 –