2015-10-02 6 views
3

я использую Entity Framework 6, у меня есть такая структура базы данных (упрощенный):Entity Framework GroupBy детей коллекция

Сделки - Id - DateTime - ...

Продукты - Id - Имя

TransactionsItems - Id - TransactionID - PRODUCTID

Как вы видите, отношение Транзакция < -> Продукт многого типа.

Я не знаю, как группировать сделки по продукции с использованием Linq - что-то вроде

transactions.GroupBy(t => t.TransactionsItems.Product) 

где TransactionsItems свойство навигации свойства порождено структурой объекта и содержит коллекцию предметов, относящихся к данной сделке.

Я знаю, что могу перебирать все продукты, а затем искать транзакционные данные и накапливать данные, но мне интересно, есть ли более простой метод для достижения моей цели?

+1

От многих до многих отношений в EF не требуется добавлять таблицу _linking_ в контекст. Затем будет 'Transaction' с коллекцией' Products' и наоборот. И вам не нужно будет группироваться. – ieaglle

ответ

1

Как @ieaglle сказал, вам не нужна ссылка в EF. Если, однако, вы должны использовать эту структуру, следующая строка должна работать:

var result = transactionItems.GroupBy(k => k.ProductID, k => trans 
.FirstOrDefault(q => q.TransactionID == k.TransactionID)); 

Edit: Iv'e прилагается весь мой тестовый код:

class Product 
{ 
    public string Name { get; set; } 
    public int ProductID { get; set; } 
} 

class Transaction 
{ 
    public string MyProperty { get; set; } 
    public int TransactionID { get; set; } 
} 

class Connect 
{ 
    public int ProductID { get; set; } 
    public int TransactionID { get; set; } 
} 

И сама программа:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Product> products = new List<Product>(); 
     products.Add(new Product(){ProductID = 1}); 
     products.Add(new Product(){ProductID = 2}); 
     List<Transaction> trans = new List<Transaction>(); 
     trans.Add(new Transaction(){TransactionID = 10}); 
     trans.Add(new Transaction(){TransactionID = 20}); 
     trans.Add(new Transaction() { TransactionID = 50 }); 
     List<Connect> con = new List<Connect>(); 
     con.Add(new Connect(){TransactionID = 10, ProductID = 1}); 
     con.Add(new Connect(){TransactionID = 20, ProductID = 1}); 
     con.Add(new Connect() { TransactionID = 50, ProductID = 2 }); 

     var r1 = con.GroupBy(k => k.ProductID, k => trans.FirstOrDefault(q => q.TransactionID == k.TransactionID)); 
    } 
} 
+0

Я использовал базу данных первый подход. Когда я удаляю объект TransactionItems, у меня нет коллекции продуктов внутри транзакции. В моей таблице ссылок также содержится информация о количестве и таких вещах, поэтому мне нужна эта таблица. Я не понимаю ваш код. – Lukas

+0

Мои группы кода по идентификатору продукта в пределах транзакции. Элементы и для каждой группировки выбирают соответствующие объекты Транзакции. Вы пытались запустить его? –

+0

Неправильный код. Не могли бы вы исправить это? – Lukas

1

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

transactions.GroupBy(t => t.TransactionsItems.Product.Name) 
Смежные вопросы