Как использовать Multi-Mapper для создания нескольких иерархий объектов «один ко многим»

У меня есть 2 модели, как показано ниже

public  class FItem
        {
            public FItem() { }

            public int RecordId { get; set; }
            public int MarketId { get; set; }
            public string ItemName { get; set; }
            public string ItemFamily { get; set; }
            public string HoverFamily { get; set; }
            public string ItemDesc { get; set; }                

            public IEnumerable<FSubsystem> FSubsystems { get; set; }
       }

   public class FSubsystem
        {
            public FSubsystem() { }

            public int FSubsystemId { get; set; }
            public int RecordId { get; set; } //Foreign key
            public int supplierId { get; set; }
            public int SubSystemTypeId { get; set; }
            public double Percentage { get; set; }
            public double? Value { get; set; }
        }

 public class FReferences
 {
     public FReferences() { }

     public int RecordID { get; set; } //Foreign key
     public int SourceID { get; set; }
     public DateTime SourceDate { get; set; }
     public string Reference { get; set; } 
     public int? ReferenceID { get; set; }
 }

и я использую dapper для извлечения данных и помещения их в объекты. код ниже

using (var multi = mapperConnection.QueryMultiple("USP_FetchMarketRecords", parameters, (SqlTransaction)null, 1000000, CommandType.StoredProcedure))
            {
                    IEnumerable<MarketRecord.FItem> FItem = multi.Read<MarketRecord.FItem>().ToList();                        
                    IEnumerable<MarketRecord.FSubsystem> FSubsystem = multi.Read<MarketRecord.FSubsystem>().ToList();                        
            }

Теперь я хочу получить подсистемы для каждого идентификатора записи и поместить их в свойство FSubsystems Fitem . Как я могу это сделать ?

Здесь я показываю только одно отношение «один ко многим» к FItem, то есть Fsubsystem. Но у меня есть много таблиц для Fitem, таких как FReferenc, FUnit и т. д. Для всех внешних ключей есть сам RecordId.

Можно ли это сделать с помощью запроса linq? или я должен использовать некоторую технику diff?


person Kuntady Nithesh    schedule 12.12.2012    source источник


Ответы (1)


Dapper не включает ничего встроенного для восстановления отношений родитель/потомок из разных наборов.

Вероятно, вы можете обобщить сценарий примерно так:

static void ApplyParentChild<TParent, TChild, TId>(
    this IEnumerable<TParent> parents, IEnumerable<TChild> children,
    Func<TParent, TId> id, Func<TChild, TId> parentId,
    Action<TParent, TChild> action)
{
    var lookup = parents.ToDictionary(id);
    foreach (var child in children)
    {
        TParent parent;
        if (lookup.TryGetValue(parentId(child), out parent))
            action(parent, child);
    }
}

Итак, если бы у нас было:

List<Parent> parents = new List<Parent> {
    new Parent { Id = 1 },
    new Parent { Id = 2 }
};
List<Child> children = new List<Child> {
    new Child { Id = 3, ParentId = 1},
    new Child { Id = 4, ParentId = 2},
    new Child { Id = 5, ParentId = 1}
};

Вы можете использовать:

parents.ApplyParentChild(children, p => p.Id, c => c.ParentId,
    (p,c) => p.Children.Add(c));
person Marc Gravell    schedule 12.12.2012
comment
Но все мои дети не одинаковой структуры. Я обновлю свой вопрос - person Kuntady Nithesh; 12.12.2012
comment
Пожалуйста, проверьте обновленный вопрос. FSubsystem и FReferences имеют разную структуру. - person Kuntady Nithesh; 12.12.2012