2012-07-04 2 views
0

Здравствуйте,Linq2SQL получить ребенок

я беру классический пример, у меня есть Customer стола и Purchase таблицу, клиент может иметь несколько заказа.

создать DBML файл и я падаю от «Окно проводника сервера» как таблицы в редакторе DBML, две сущности генерируются: Customers и Purchases

У меня есть некоторые объекты:

public interface IMyCustomer 
{ 
    int Id { get; set; } 
    string Code { get; set; } 
    string Firstname { get; set; } 
    string Lastname { get; set; } 
    List<IMyPurchase> Purchases { get; set; } 
} 

public class MyCustomer : IMyCustomer 
{ 
    public int Id { get; set; } 
    public string Code { get; set; } 
    public string Firstname { get; set; } 
    public string Lastname { get; set; } 
    public List<IMyPurchase> Orders { get; set; } 
} 

public interface IMyPurchase 
{ 
    int Id { get; set; } 
    string Code { get; set; } 
    DateTime CreationDate { get; set; } 
} 

public class MyPurchase : IMyPurchase 
{ 
    public int Id { get; set; } 
    public string Code { get; set; } 
    public DateTime CreationDate { get; set; } 
} 

var result = 
    from customer in _dataContext.Customers 
    join order in _dataContext.Purchases on customer.Id equals order.IdCustomer 
    select new MyCustomer 
    { 
     Code = customer.Code, 
     Firstname = customer.Firstname, 
     Lastname = customer.Lastname, 
     Id = customer.Id, 
     Purchases = _dataContext.Purchases 
      .Select(x => x.IdCustomer == customer.Id) 
      .Cast<IMyPurchase>() 
      .ToList<IMyPurchase>() 
    }; 

LINQ работа запроса. Для ввода результата у меня есть вся информация о customer, у меня есть правильное число строк в Purchases, но каждое свойство каждой записи Purchases равно null. Я бы хотел загрузить Customer info и ВСЕ purchase

Есть идеи?

Спасибо,

ответ

0

Это не кажется, что у вас есть какая-либо логика перевода между Purchase и MyPurchase.

Также метод Cast<>() попытается использовать неявное литье, но если ваши объекты Linq-to-SQL не реализуют этот интерфейс, он не может быть выбран таким образом.

Мое предложение было бы использовать что-то вроде AutoMapper или добавить логику перевода в ваш оператор linq (аналогично тому, что вы делаете с MyCustomer). Что-то вроде:

var result = 
    from customer in _dataContext.Customers 
    join order in _dataContext.Purchases on customer.Id equals order.IdCustomer 
    select new MyCustomer 
    { 
     Code = customer.Code, 
     Firstname = customer.Firstname, 
     Lastname = customer.Lastname, 
     Id = customer.Id, 
     Purchases = _dataContext.Purchases 
      .Where(x => x.IdCustomer == customer.Id) 
      .Select(x => new MyPurchase { 
       Id = x.Id, 
       Code = x.Code, 
       CreationDate = x.CreationDate 
      }).ToList(); 
    }; 
+0

У меня есть много туда и обратно в базу данных, для каждой покупки у меня есть туда и обратно, не представляется возможным чтобы избежать этого? –

+0

Соединение, которое использует @Johnn Blade, будет запрашивать только один раз. Вместо того, чтобы выбирать новый анонимный тип, как в своем примере, просто используйте тот же механизм select, что и в моем ответе, но вместо ссылки на '_dataContext.Purchases' используйте объединенный ObjectSet. – lukiffer

0

Вот пример, и где ваш идентификатор клиента в покупке

var items = (from p in _dataContext.Purchases 
       join c in _dataContext.Customers 
       on p.CustomerID equals c.ID 
       where (c.ID == customerId) 
       orderby p.CreationDate descending 
       select new { p, c }); 

foreach (var data in items) 
{ 
    // do stuff 
    int customerId = data.c.ID; 
    int purchaseId = data.p.ID; 
    // you can acces all properties of both objects 
} 
+0

Конечно, я бы хотел избежать цикла –

Смежные вопросы