2009-08-27 2 views
1

У меня есть следующие две таблицы:Дозвуковые 3 и Linq Группировка с графом

Customer 
{ 
int Id 
int Name 
} 

Bills 
{ 
int Id 
int CustomerId 
decimal Amount 
bool IsDue 
} 

Теперь я пытаюсь получить список, где у меня есть:

  1. Запись для каждого клиента с количество связанных векселей.
  2. Запись для каждого клиента с подсчетом связанных счетов, где IsDue истинно.

Я попытался сделать первый так:

var results = from c in _db.Customers 
       join b in _db.Bills on c.Id equals b.CustomerId into j1 
       from j2 in j1 
       group j2 by c.Id into grouped 
       select new 
        { 
         CustomerId = grouped.Key, 
         NoOfBills = grouped.Count() 
        }; 

Это бросает ошибку: выражение типа 'System.Collections.Generic.IEnumerable 1[OutstandingMonitor.MonitorData.Customer]' cannot be used for parameter of type 'System.Linq.IQueryable 1 [OutstandingMonitor.MonitorData.Customer] ...

Пожалуйста, помогите мне решить эту проблему.

Кроме того, можно объединить оба вопроса?

PS: Использование Дозвуковой 3.0.0.3 с ActiveRecord

ответ

1

я нашел не так эффективное решение (если оно является эффективным в самом деле, я буду любить знать ...: P). Вот он:

var results = from d in _db.Bills 
      group d by d.CustomerId into g 
      select new 
      { 
       CustomerId = g.Key, 
       NoOfBills = g.Count() 
      }; 

var results2 = from c in _db.Customers 
      join r in results on c.Id equals r.CustomerId 
      select new 
      { 
       CustomerId = r.CustomerId, 
       CustomerName = c.Name, 
       City = c.City, 
       NoOfBills = r.NoOfBills 
      }; 

На данный момент это прекрасно работает.

0

Везде, где вы используете значение «счетчика клиента ассоциированных счетов» в, вы не можете просто сделать это в LINQ (это будет только работать, однако , если у вас есть соответствующие отношения, установленные в DBML):

var customers = _db.Customers; // Not necessary, but here for clarity 

// ... more code 

// Access the number of bills for each customer: 

foreach (var customer in customers) 
{ 
    int totalBills = customers.Bills.Count(); 
    int totalDueBills customers.Bills.Where(b => b.IsDue).Count(); 
} 
+0

Я думаю, вы имеете в виду LINQ to SQL, и он использует SubSonic. –

+0

Да. И я использую SQLite. Есть ли способ генерировать отношения с внешним ключом с SubSonic и SQLite? – Yogesh

+0

@John - правильно, я извиняюсь за допущение LINQ-to-SQL, хотя я удивлен, что нечто подобное не может быть сделано. – Keith

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