Linq inner join для списка в списке

253
07 мая 2017, 22:51

У меня есть такие классы модели:

public class Transaction
{
    public Guid ID { get; set; }
    public Guid CategoryID { get; set; }
    public List<Guid> Tags { get; set; }
}
public class Category
{
    public Guid ID { get; set; }
    public string Caption { get; set; }
}
public class Tag
{
    public Guid ID { get; set; }
    public string Caption { get; set; }
}

Есть хранилище этих объектов. Еще у меня есть ViewModels:

public class TransactionViewModel
{
    public Guid ID { get; set; }       
    public CategoryViewModel Category { get; set; }
    public List<TagViewModel> Tags { get; set; }        
}
public class CategoryViewModel
{
    public Guid ID { get; set; }
    public string Caption { get; set; }
}
public class TagViewModel
{
    public Guid ID { get; set; }
    public string Caption { get; set; }
}

Теперь мне нужно с помощью linq сделать List<TransactionViewModel> из List<Transaction>. Как сделал я:

Categories = ModelRepository.Categories.Select(p => new CategoryViewModel(p)));
Tags = ModelRepository.Tags.Select(p => new TagViewModel(p)));
var trans = from t in ModelRepository.Transactions
            join c in Categories on t.CategoryID equals c.ID
            select new TransactionViewModel()
            {
              ...,
              Category = c
            };
Transactions = trans.ToList();

Теперь при изменении любого CategoryViewModel в Categories, я сразу получу изменения для всех TransactionViewModel.Category. Вопрос - как мне заполнить TransactionViewModel.Tags? Желательно с помощью LINQ. И обязательно чтобы при изменении любого TagViewModel в Tags, я сразу получал изменения во всех TransactionViewModel.Tags.

Answer 1

Проблема с дизайном на лицо. Лучше еще раз его продумать, но в том, что я вижу сейчас, должно сработать такое:

var trans = from t in ModelRepository.Transactions
            join c in Categories on t.CategoryID equals c.ID
            select new TransactionViewModel
            {
                ...,
                Category = c,
                Tags = t.Tags.Select(guid => Tags.First(tag => tag.ID == guid)).ToList()
            };
READ ALSO
Как перевести массив байт обратно в строку

Как перевести массив байт обратно в строку

Есть метод, который переводит строку в массив байт:

237
Получить доступ к компонентам из Form1 в UserControl

Получить доступ к компонентам из Form1 в UserControl

Как я могу получить доступ к компонентам (например: treeView, combobox,editText) из формы Form1 в UserControl?

207
Как отобразить название файла в label?

Как отобразить название файла в label?

Как из компонента listBox отобразить имя автора музыки в label1, а название композиции label2? Пользователь нажимает button который воспроизводит композицию,...

301
Проверка формата файла

Проверка формата файла

Добрый вечерКак можно проверить формат файла? Если формат текстового документа, то принимаем, а если нет, то ловим исключение

206