按索引c#访问实体数组

时间:2013-05-04 10:54:45

标签: c# linq-to-entities entity-framework-4.1

我有一个代表矩阵的表:

CustType  DiscountGroup1 DiscountGroup2 DiscountGroup3
Wholesale        32           10               15  
Retail           10           15               0 

我所有的库存商品都有相应的折扣组代码1,2或3。

在开发票时,我想查找客户类型对正在开具发票的商品的折扣。

该表需要能够增长,以包括新的客户类型和新的折扣组,因此没有任何东西可以硬编码。

我想我会把数据拉成一个数组,所以我可以按索引选择列,但是我的实体太聪明了我感到难过......

var disc = (from d in context.CustDiscountGroups
                    where d.CustType == Wholesale
                    select d).ToArray(); 

我只能按名称访问列,即:disc[0].DiscountGroup1

如果我尝试disc[0,1]我会收到错误,指出错误的索引数量。

我错过了什么?我觉得这是一个荒谬的根本。我唯一的另一个想法是将列命名为1,2,3等,并构建一个sql select字符串,我可以使用变量来表示列名。

数据库也处于设计阶段,因此可以以任何方式重新制作表格,我正在努力让我的脑袋绕着哪个方向来解决问题。

1 个答案:

答案 0 :(得分:0)

您的实体CustDiscountGroups拥有属性CustType, DiscountGroup1, DiscountGroup2, DiscountGroup3而您的查询返回数组CustDiscountGroups,因此您无法像[0,1]那样访问没有2D数组

如果您需要访问第一项,则可以将其作为disc[0]获取,然后您可以按属性名称获取折扣组的任何属性。喜欢

disc[0].CustType, disc[0].DiscountGroup1, disc[0].DiscountGroup2, disc[0].DiscountGroup3

如果要获取数组数组,请使用反射获取属性值,如下所示

var disc = context.CustDiscountGroups.Where(c=>c.CustType == Wholesale)
             .Select(v=>typeof(CustDiscountGroups)
                         .GetFields(System.Reflection.BindingFlags.Public)
                          .Select(f=>f.GetValue(v)).ToArray())
              .ToArray();

var disc = context.CustDiscountGroups.Where(c=>c.CustType == Wholesale)
             .Select(v=>typeof(CustDiscountGroups)
                         .GetProperties()
                          .Select(f=>f.GetValue(v,null)).ToArray()).ToArray();

现在您可以访问disc[0][1]

等值

请注意:我没有编译和测试上面的代码,请按照您的想法获取想法并进行更改