Код запроса LINQ для сложного объединения данных - PullRequest
0 голосов
/ 16 марта 2010

Я уже писал об этом раньше, но плохо сформулировал. Я пытаюсь снова с более хорошо продуманной структурой.

У меня есть следующий код, и я пытаюсь выяснить более короткое выражение linq, чтобы сделать его «встроенным». Пожалуйста, проверьте метод "Run ()" внизу. Я пытаюсь понять, как объединить два словаря на основе совпадающего идентификатора в одном из объектов, чтобы я мог использовать запрос в синтаксисе такого рода.

 var selected = from a in items.List()
                // etc. etc.
                select a;

чтобы я мог определить свою структуру в коде как ...

TModelViewModel = new TModelViewModel
{
 TDictionary = from a in items... etc. etc... 
}

вместо прохождения нескольких циклов foreach, дополнительных объявлений объектов и т. Д.


Это моя классовая структура. Метод Run () - это то, что я пытаюсь упростить. В основном мне нужно сделать это преобразование встроенным в нескольких местах, и я хотел значительно упростить его, чтобы я мог определить его более «чисто».

class TModel
{
    public Guid Id { get; set; }
}
class TModels : List<TModel>
{
}
class TValue
{
}

class TStorage
{
    public Dictionary<Guid, TValue> Items { get; set; }
}

class TArranged
{
    public Dictionary<TModel, TValue> Items { get; set; }
}
static class Repository
{
    static public TItem Single<TItem, TCollection>(Predicate<TItem> expression)
    {
        return default(TItem); // access logic.
    }
}

class Sample
{
    public void Run()
    {
        TStorage tStorage = new TStorage();
        // access tStorage logic here.

        Dictionary<TModel, TValue> d = new Dictionary<TModel, TValue>();

        foreach (KeyValuePair<Guid, TValue> kv in tStorage.Items)
        {
            d.Add(Repository.Single<TModel, TModels>(m => m.Id == kv.Key),kv.Value);
        }
    }
}

1 Ответ

1 голос
/ 16 марта 2010

На самом деле это не проверялось, и это довольно уродливо, но я думаю это должно сработать:

        Dictionary<TModel, TValue> d = new Dictionary<TModel, TValue>();

        d = d.Concat(tStorage
            .Items
            .Select(i => new KeyValuePair<TModel, TValue>(
                new TModel { Id = i.Key }, i.Value))).ToDictionary(i => i.Key, i => i.Value);
...