0

假设我有一个包含 30 个属性的对象列表(例如Items:)

如果我将 LINQ Query-Syntax 用于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
               }
4

2 回答 2

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;
}
于 2018-09-05T08:31:32.560 回答
0

看到要求我认为你应该改变你的班级结构。他们有两种方式

  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);
于 2018-09-05T08:38:41.020 回答