这是使用LINQ查询语法分配属性的较短方法吗?

时间:2018-09-05 08:20:33

标签: linq linq-query-syntax

说我有一个具有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 :(得分:2)

您可以使用诸如AutoMapper之类的库。对于aItemViewModel之间的属性名称相同,它可以使用反射为您进行映射;对于具有不同名称的属性,您可以定义手动映射;对于来自其他对象的属性( 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;
}

答案 1 :(得分:0)

看到要求,我认为您应该更改班级结构。他们有两种方式

  1. ItemViewModel应该从与item相同的类派生,或者
  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);