SQL" IN"作为LINQ查询使用方法语法

时间:2014-12-25 04:50:09

标签: sql linq

我有一组相关的表,我试图返回一个结果集,我只是无法获得正确的语法来获得我想要的结果。

我正试图以合适的州返回一份国家名单(美国是目前唯一的预期国家)。 “适当的”要求是我只想返回由我们的一个客户代表的国家下的州......即....如果我们有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()
                });

任何有助于指出我遗失/做错的任何帮助都将非常感激。

1 个答案:

答案 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()
        });