Как объединить 3 таблицы с лямбда-выражением? - PullRequest
10 голосов
/ 03 февраля 2012

У меня есть простой лямбда-запрос LINQ, но я хочу добавить третье соединение с предложением where.Как мне это сделать?

Вот мой единственный запрос на присоединение:

var myList = Companies
    .Join(
        Sectors,
        comp => comp.Sector_code,
        sect => sect.Sector_code,
        (comp, sect) => new {Company = comp, Sector = sect} )
    .Select( c => new {
        c.Company.Equity_cusip,
        c.Company.Company_name,
        c.Company.Primary_exchange,
        c.Company.Sector_code,
        c.Sector.Description
    });

Я хочу добавить следующую команду SQL в вышеупомянутый запрос LINQ и по-прежнему поддерживать прогнозы:

SELECT
    sector_code, industry_code 
FROM
    distribution_sector_industry 
WHERE
    service = 'numerical'

3-е соединение будет выполнено с таблицей секторов и Distribution_sector_industry для кода сектора.

Заранее спасибо.

Ответы [ 4 ]

30 голосов
/ 03 февраля 2012

Просто предположение:

var myList = Companies
    .Join(
        Sectors, 
        comp => comp.Sector_code,
        sect => sect.Sector_code,
        (comp, sect) => new { Company = comp, Sector = sect })
    .Join(
        DistributionSectorIndustry.Where(dsi => dsi.Service == "numerical"), 
        cs => cs.Sector.Sector_code,
        dsi => dsi.Sector_code,
        (cs, dsi) => new { cs.Company, cs.Sector, IndustryCode = dsi.Industry_code })
    .Select(c => new {
        c.Company.Equity_cusip,
        c.Company.Company_name,
        c.Company.Primary_exchange,
        c.Company.Sector_code,
        c.Sector.Description,
        c.IndustryCode
});
14 голосов
/ 03 февраля 2012

Хорошо, я не понимаю, почему вы хотите выбрать код_сектора, когда вы уже знаете его, но я думаю, что вы хотите это:

var query = from company in Companies
            join sector in Sectors
              on company.SectorCode equals sector.SectorCode
            join industry in DistributionSectorIndustry
              on sector.SectorCode equals industry.SectorCode
            where industry.Service == "numerical"
            select new {
                company.EquityCusip,
                company.CompanyName,
                company.PrimaryExchange,
                company.SectorCode,
                sector.Description,
                industry.IndustryCode
            };

Примечания:

  • Я изменил его в выражение запроса, так как это намного более читаемый способ выражения запроса, подобный этому.
  • Несмотря на то, что предложение "where" идет после объединения, предполагая, что это запрос LINQ to SQL или Entity Framework, это не должно иметь никакого значения
  • Я увеличил имена переменных диапазона для ясности
  • Я преобразовал ваши другие имена в обычные имена .NET; Вы можете сделать это тоже в вашей модели
2 голосов
/ 16 апреля 2018

Для 4 таблиц

var query = CurrencyDeposits
.Join(Customers, cd => cd.CustomerId, cus => cus.Id, (cd, cus) 
=> new { CurrencyDeposit = cd, Customer = cus })
.Join(Currencies, x => x.CurrencyDeposit.CurrencyId, cr => cr.Id, (x, cr) 
=> new { x.CurrencyDeposit, x.Customer, Currency =  cr })
.Join(Banks, x => x.CurrencyDeposit.BankId, bn => bn.Id, (x, bn) 
=> new { x.CurrencyDeposit, x.Customer, x.Currency, Bank = bn})
.Select(s => new {
s.CurrencyDeposit.Id,
s.Customer.NameSurname,
s.Currency.Code,
s.Bank.BankName,
s.CurrencyDeposit.RequesCode
});
2 голосов
/ 03 февраля 2012

Попробуйте что-то вроде этого ...

var myList = ({from a in Companies 
join b in Sectors on a.Sector_code equals b.Sector_code
join c in Distribution on b.distribution_code equals a.distribution_code
select new {...});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...