Это более короткий способ назначения свойств с помощью синтаксиса запросов LINQ? - PullRequest
0 голосов
/ 05 сентября 2018

Скажем, у меня есть список объектов с 30 свойствами (например: Items)

Если я использую синтаксис запроса LINQ для Join другого объекта (например: Store), кажется неизбежным, что я должен переназначить каждое свойство из Item, верно?

Например:

    var temp = from a in items
               join b in stores on a.storeKey = b.storeKey into b2
               from c in b2.DefaultIfEmpty()
               select new ItemViewModel()
               {
                  p1 = a.p1,
                  p2 = a.p2,
                  ....
                  p30 = a.p2, //re-assign 30 times (T.T)

                  storeInfo1 = c.storeInfo1 //all i want is 1 or 2 additional info from store
               }

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Видя требование, я думаю, вы должны изменить структуру своего класса. Это два способа

  1. ItemViewModel должен быть производным от того же класса, что и элементы, или
  2. это должно свойство внутри него

Пишу вторым путем

class Item
{
     string p1;
     ......
}

class ItemViewModel
{
     string p1;
     ......
     string storeInfo1;
     Item item;

     ItemViewModel(Item item, string storeInfo)
     {
        this.item= item;
        this.storeInfo1 = storeInfo;
     }
}

var temp = from a in items
           join b in stores on a.storeKey = b.storeKey into b2
           from c in b2.DefaultIfEmpty()
           select new ItemViewModel(a, c.storeInfo1);
0 голосов
/ 05 сентября 2018

Вы можете использовать библиотеку, такую ​​как AutoMapper . Для имен свойств, которые одинаковы между a и ItemViewModel, он может выполнить сопоставление для вас с помощью отражения, для свойств с другими именами вы можете определить сопоставление вручную, а для свойств, поступающих из других объектов (b и c) Вы можете использовать помощника.

Примерно так:

var temp = from a in items
           join b in stores on a.storeKey = b.storeKey into b2
           from c in b2.DefaultIfEmpty()
           select CreateModelFrom(a, b, c);

public ItemViewModel CreateModelFrom(ObjA a, ObjB b, ObjC c)
{
    var model = Mapper.Map<ObjA, ItemViewModel>();
    model.xxx = b.xxx;
    model.storeInfo1 = c.storeInfo1;
    return model;
}
...