Linq соединяется за одним столом с 4 разными внешними ключами - PullRequest
0 голосов
/ 15 октября 2018

Итак, я получил свою таблицу адресов и таблицу контрактов.Я хочу перебрать все контракты и сгенерировать некоторые Dtos из них, но с адресом-именем и номером вместо идентификатора (guid).Моя проблема в том, что в таблице адресов есть 4 внешних ключа из таблицы контрактов.Могу ли я сделать это как-нибудь с помощью объединения, или, может быть, даже с несколькими?

Это то, что я сейчас пытаюсь:

  var contracts = context.Contracts
    .Join(context.Addresses, 
       (con => con.AddressId), 
       (adr => adr.AddressId), 
       (con,adr) 
       => new { contractInfo = con, addressInfo = adr });

      foreach(var a in contracts) {
          new MyDto() {
            AddressId = a.addressInfo.AddressNumber,
            AddressName = a.addressInfo.FullName,
            Date= a.contractInfo.Date,
            AnotherDate = a.contractInfo.AnotherDate,
            Text = a.contractInfo.Text,
            VerweisAdrId = a.addressInfo. // ???
            VerweisAdrName = a.addressInfo. // 2 more cases like this would follow
          }
        }

Мой другой подход, вероятно, будет генерировать слишком много запросов:

  var addresses = context.Addresses;
  var contracts = context.Contracts;

  foreach(var a in contracts) {
      new MyDto() {
        AddressId = addresses.Where(x => a.AddressId == x.AddressId).Select(y => y.AddressNumber);
        AddressName = addresses.Where(x => a.AddressId == x.AddressId).Select(y => y.FullName);
        Date= a.Date,
        AnotherDate = a.AnotherDate,
        Text = a.Text,
        VerweisAdrId = addresses.Where(x => a.VerweisAdrId == x.AddressId).Select(y => y.AddressNumber);
        VerweisAdrName = addresses.Where(x => a.VerweisAdrId == x.AddressId).Select(y => y.FullName);
      }
  }

1 Ответ

0 голосов
/ 16 октября 2018
var contracts = context.Contracts
    .Join(context.Addresses, 
       (con => con.AddressId), 
       (adr => adr.AddressId), 
       (con,adr) 
       => new { contractInfo = con, addressInfo = adr })
    .Join(context.Addresses,
        ca => ca.contractInfo.VerweisAdrId,
        adr => adr.AddressId,
        (ca, adr) => new { ca.contractInfo, ca.addressInfo, verweisAdr = adr })
    // ... and so on
    .Select(cavwx => new MyDto() {
        AddressId = cavwx.addressInfo.AddressNumber,
        AddressName = cavwx.addressInfo.FullName,
        VerweisAdrId = cavwx.verweisAdr.AddressNumber,
        VerweisAdrName = cavwx.verweisAdr.FullName,
        // ... and so on
     });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...