Как включить список родительских объектов в объект дочернего объекта - PullRequest
1 голос
/ 16 марта 2011

В моей базе данных есть следующие таблицы

Table1: tblAddressType (Id, Name)

Table2: tblAddressDtls (Id, AddressTypeId, Address1)

Мне осталось присоединиться к двум вышеуказанным таблицам, чтобы получить список всех типов адресов и соответствующие детали адреса следующим образом

SQL Query:    

    select t1.*, t2.*
    from tblAddressType t1
    left outer join tblAddressDtls t2 on t1.Id = t2.AddressTypeId and t2.Id = 1;

Для приведенных выше таблиц я создал классы сущностей POCO следующим образом:

[Table("tblAddressType ")]
public partial class AddressType
{

    [Key]
    [Column(Name="ID")]
    public int ID { get; set; }

    [Required]
    [Column(Name = "Name")]
    public virtual string Name {get; set;}

    [Include]
    [Association("AddressTypeAddress", "ID", "AddressTypeId")]
    public virtual ICollection<Address> Addresses { get; set; }
}


[Table("tblAddress", SchemaName="dbo")]
public class Address
{
    [Column(Name="ID")]
    public int ID { get; set; }

    [Column(Name = "AddressTypeId")]
    public int? AddressTypeId{ get; set; }

    [Column(Name = "Address1")]
    public string Address1{ get; set; }

    [Include]
    [Association("AddressTypeAddress", "AddressTypeId", "ID", IsForeignKey = true)]
    public virtual AddressType AddressType { get; set; }

}

и, чтобы получить данные, как показано в запросе sql выше, я написал следующий запрос LINQ в своем сервисном коде, и этозапрос возвращает мне данные по мере необходимости:

var qry = (from p in dbContext.AddressTypes
           join pa in (from t in dbContext.Addresses 
                       where t.ID == 1 select t)
                       on p.ID equals pa.AddressTypeId into ppa
           from t in ppa.DefaultIfEmpty()
           select t).AsQueryable();

Теперь я хочу написать метод доменной службы с именем «GetAddressById (int addressId)», который должен вернуть мне соответствующий объект Address вместе со списком объектов AddressType какмне нужно привязать список объектов AddressType к выпадающему списку на экране добавления / редактирования адреса.

I wanted to include and fetch list of "AddressType" objects data at the time of 
fetching Address object data itself to avoid round-trip to server 
in my silverlight client app. 

Пожалуйста, предложите мне наилучший способ достижения этой функциональности?

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

NEW: Я предполагаю, что в базе данных адреса имеют отношение к AddressTypes и снова, что вы используете EntityFramework.

GetAddressById(int addressId){
   return dbContext.Address.SingleOrDefault(a => a.ID == addressId).Include("AddressTypes");
}

эта строка кода теперь получит один адрес с идентификатором addressId; если его нет, он вернет ноль или если будет возвращено больше, то будет сгенерировано исключение, оператор Include скажет EF, что вы также хотите, чтобы AddressTypes был загружается, когда вы получаете адрес и создаете соответствующее соединение, чтобы это произошло, все это превращается в один запрос к базе данных и получает желаемый результат.

OLD: Допустим, мы хотим, чтобы AddressType и все его адреса были всего одним вызовом БД (при условии, что вы используете EntityFramework), мы бы вызвали метод, подобный

GetAddressTypeIncludingAddresses(int id){
    return _context.AddressType.Include("Addressess"); 
 /*if you use ctp5 of ef code first you should even be able to do (at => at.Addresses) in the include */
}

и затем, когда он у вас есть, просто сделайте addressType.Id и foreach(var address in addressType.Addresses){} и т. П., Когда вы его используете.

Надеюсь, я понял ваш вопрос, если не повторите попытку, я отредактирую свой ответ.

1 голос
/ 16 марта 2011

Вы можете сделать это, создав хранимый процесс в вашей базе данных, который возвращает множество результатов.Во-первых, тот, который дает вам желаемого ребенка и родителя, и второй, который получает ваш список родителей.Затем вы можете использовать обходной путь, описанный здесь:

http://blogs.msdn.com/b/swiss_dpe_team/archive/2008/02/04/linq-to-sql-returning-multiple-result-sets.aspx

, который позволяет получить каждую часть результатов.вам не нужно левое соединение для вашего запроса.Поскольку ваше предложение where ссылается на таблицу справа, вы никогда не получите нулевые значения в правой части объединения.Вместо этого используйте внутреннее соединение.

...