エンティティフレームワークを使用した動的クエリの作成のパターンに従って、いくつかのテーブルにわたって検索機能を作成しようとしています
私は3つのテーブルを持っています:
People:
pk ID
varchar FirstName
varchar LastName
fk AddressMap_ID
AddressMap:
pk ID
Address:
pk ID
varchar StreetName
varchar StreeNumber
fk AddressMap_ID
1つの住所に複数の人が住むことができます。検索モデルを渡し、結果プロパティにデータを入力します。
public class Search
{
public string streetname { get; set; }
public string streetnumber { get; set; }
public string fname { get; set; }
public string lname { get; set; }
public IEnumerable<Results> results { get; set; }
}
public class Results
{
public int AddressID { get; set; }
public string StreetNumber { get; set; }
public string StreetName { get; set; }
public IEnumerable<PeopleResults> people { get; set; }
}
public class PeopleResults
{
public int personID { get; set; }
public string First { get; set; }
public string Last { get; set; }
}
これは、アドレス、または名前+アドレスでフィルタリングすると機能します。
public void GetResults(Search model)
{
Entities _context;
_context = new Entities();
var addr = from a in _context.Addresses
select a;
addr = addr.Where(filter => filter.StreetNumber == model.streetnumber);
addr = addr.Where(filter => filter.StreetName == model.streetname);
addr = from a in addr
group a by a.AddressMap_ID into addrs
select addrs.FirstOrDefault();
var ppl = from p in addr.SelectMany(p => p.AddressMap.People) select p;
ppl = ppl.Where(filter => filter.FirstName.StartsWith(model.fname));
ppl = ppl.Where(filter => filter.LastName.StartsWith(model.lname));
model.results = from a in addr
select new Results
{
AddressID = a.ID,
StreetName = a.StreetName,
StreetNumber = a.StreetNumber,
people = from p in ppl
select new PeopleResults
{
First = p.FirstName,
Last = p.LastName
}
};
}
しかし、名前でフィルタリングしようとすると、デカルト結合が返されます。つまり、一致したすべての人が含まれるすべてのアドレスです。
検索には3つの方法があります。アドレスのみでフィルタリングする、アドレス+名前でフィルタリングする、または名前のみでフィルタリングする。
したがって、誰かが「123 Main」を検索すると、結果は次のようになります。
123 Main St SticksVille Joe Smith
Jane Smith
Mary Smith
123 Main St Bedrock Fred Flintstone
Wilma Flintstone
「JSmith123Main」を検索すると、次のようになります。
123 Main St SticksVille Joe Smith
Jane Smith
そして、「JSmith」だけを検索すると次のようになります。
123 Main St SticksVille Joe Smith
Jane Smith
456 Another St Sometown Jerry Smith