我有一组相关的表,我试图返回一个结果集,我只是无法获得正确的语法来获得我想要的结果。
我正试图以合适的州返回一份国家名单(美国是目前唯一的预期国家)。 “适当的”要求是我只想返回由我们的一个客户代表的国家下的州......即....如果我们有3个客户,2个在德克萨斯州,1个在OK,我需要返回“美国(只有德克萨斯州和OK ......而不是我们没有客户的其他48个州)的查询。”
我可以让查询只返回美国,但它会返回所有状态,而不仅仅是我所追求的状态。这是我“想要”运行的查询示例....注意:FirstAdminDivision表=状态表。
select * from Country c
inner join FirstAdminDivision f on f.CountryId = c.CountryId
where f.FirstAdminDivisionId IN
(
select f2.FirstAdminDivisionId from Company C
inner join [Address] a on a.AddressId = c.AddressId
inner join City cty on cty.CityId = a.CityId
inner join FirstAdminDivision f2 on f2.FirstAdminDivisionId = cty.FirstAdminDivisionId
)
这是我目前拥有的代码(与我能够获得的代码尽可能接近),只返回美国所有州。 “ids”列表只包含德克萨斯和OK,就像我期望的那样,所以我认为它们的问题在于主要选择中的位置。
IQueryable<int> innerQ = base.Context.Set<FirstAdminDivision>().Where(x => x.Cities.Any(y => y.Addresses.Any(z => z.Companies.Any()))).Select(x => x.FirstAdminDivisionId);
List<int> ids = innerQ.ToList();
IQueryable<ICountryModel> q2 = base.Context.Set<Country>()
.Include(x => x.FirstAdminDivisions)
.Where(x => x.FirstAdminDivisions.Where(y => innerQ.Contains(y.FirstAdminDivisionId)).Any())
.Select(x => new CountryModel
{
Abbreviation = x.Abbreviation,
CountryId = x.CountryId,
Name = x.Name,
UrlDisplay = x.UrlDisplay,
FirstAdminDivisions = x.FirstAdminDivisions.Select(y => new FirstAdminDivisionModel
{
Abbreviation = y.Abbreviation,
Name = y.Name,
UrlDisplay = y.UrlDisplay
}).ToList()
});
任何有助于指出我遗失/做错的任何帮助都将非常感激。
答案 0 :(得分:1)
基本上我会使用你的第一个查询作为基本查询而不是所有国家,而不是返回一个int列表,我希望它返回一个FirstAdminDivision对象列表。
所以在这种情况下你会在该列表中有两个对象OK和Texas。在这种情况下,你也应该有国家可用,因为你说FirstAdminDivision有国家作为财产
然后从该列表中我将包含country对象,以便您可以按国家/地区对这两个状态对象进行分组。然后使用密钥,国家/地区和状态列表构建模型。
这样的事情:
IQueryable<ICountryModel> countriesWithStates = base.Context.Set<FirstAdminDivision>()
.Where(x => x.Cities.Any(y => y.Addresses.Any(z => z.Companies.Any())))
.Include(x => x.Country)
.GroupBy(x => x.Country, y=>y, (countryKey, states) => new { Country = countryKey, States = states.ToList() })
.Select(x => new CountryModel
{
Abbreviation = x.Country.Abbreviation,
CountryId = x.Country.CountryId,
Name = x.Country.Name,
UrlDisplay = x.Country.UrlDisplay,
FirstAdminDivisions = x.States.Select(y => new FirstAdminDivisionModel
{
Abbreviation = y.Abbreviation,
Name = y.Name,
UrlDisplay = y.UrlDisplay
}).ToList()
});