2014-12-16 2 views
4

Мне было любезно помогло с this Stack Overflow question.Добавление соединения к существующему запросу LINQ

Теперь я построения запроса и нужно добавить присоединяется к другим таблицам, чтобы принести в названиях и описаниях и т.д.

Мой запрос состоит в следующем:

using (var ctx = new myEntities()) 
      { 
       var pc = ctx.tblPostcodes.Where(z => z.Postcode == postcodeOutward) 
         .Select(x => new {postcodeId = x.PostcodeID}).Single(); 

       int pcId = pc.postcodeId; 

       var q = ctx.tblPrices.OrderByDescending(x => x.Cost) 
       .Where(c => c.PostcodeID == pcId) 
       .Where(s => s.ItemID < 18) 
       .GroupBy(x => x.ItemID) 
       .Select(g => new { g, count = g.Count() }) 
       .ToList() 
       .SelectMany(t => t.g.Select(b => b).Zip(Enumerable.Range(1, t.count), (j, i) => new { j.ItemID, j.Cost, j.SupplierID })); 

       foreach (var i in q) 
       { 
        sb.AppendFormat("ItemId = {0}, Cost = {1}, SupplierId = {2}<hr/>", i.ItemID, i.Cost, i.SupplierID); 
       } 
      } 

И я пытаюсь добавьте следующее соединение:

.Join(ctx.tblItems, it => it.ItemID, s => s.ItemID, (it, s) => new { it, s }) 

, но это вызывает неоднозначные ошибки вызова. Есть идеи? Мне нужно добавить еще два внутренних соединения. Я надеюсь получить одно право, а два других будут легко (надеюсь).

+0

вы используете базу данных сначала? –

+0

Да! Я должен был использовать его в настоящее время. – ComfortablyNumb

+1

В зависимости от модели вы должны иметь возможность делать «сумасшедшие» вещи (в Stored Proc land), например: 'x.Address.PrimaryOwner.Name' и Linq будут обрабатывать все необходимые соединения в фоновом режиме. Выражайте результат, а не то, как вы привыкли его получать. – jessehouwing

ответ

3

Если вы используете базу данных, сначала EF создает для вас навигационные свойства, поэтому вам не нужно присоединяться.

Если вы хотите получить эту информацию вне запроса, используйте команду .Include ("Navigational Property Name"), чтобы добавить ваши «Соединения», что приведет к добавлению в запрос соответствующих объектов или списка объектов результат.

var q = ctx.tblPrices.Include("tblItems").OrderByDescending(x => x.Cost) 

Лучше смотреть на EF модели, чтобы выяснить, что свойство называется ...

+0

Используемые свойства навигации. Очень здорово. – ComfortablyNumb

+0

Это был копейки, эвенкийский момент для меня. Благодарю вас и @jessehourwing! – ComfortablyNumb

+0

Добро пожаловать –

1

Попробуйте это, я не знаю, будет ли он работать в первой попытке, но это хорошо отправная точка!

using (var ctx = new myEntities()) 
{ 
    var pc = ctx.tblPostcodes 
     .First(x => x.Postcode == postcodeOutward) 
     .Select(x => new { postcodeId = x.PostcodeID }); 

    var prices = ctx.tblPrices 
     .Where(x => x.PostcodeID == pc.postcodeId) 
     .OrderByDescending(x => x.Cost) 
     .ToList(); 

    var items = ctx.tblItems 
     .Where(y => y.ItemID < 18) 
     .GroupBy(y => y.ItemID) 
     .Select(y => new { y, count = y.Count() }) 
     .ToList(); 

    // Join 
    var q = prices 
     .Join(items, 
      pr => pr.ItemID, 
      it => it.ItemID, 
      (pr, it) => new 
      { 
       pr.ItemID, 
       pr.Cost, 
       pr.SupplierID 
      }) 
     .ToList(); 

    q.Select(x => sb.AppendFormat("ItemId = {0}, Cost = {1}, SupplierId = {2}<hr/>", 
     x.ItemID, x.Cost, x.SupplierID)); 
} 
Смежные вопросы