0

我有一个 MVC 应用程序,其中一个页面上有一个动态表,用户定义了表有多少列、列顺序以及从哪里获取每个字段的数据。

我写了一些非常糟糕的代码来保持动态,现在我希望它更有效率。

我的问题是我不知道如何定义我应该在运行时回到我的 IEnumerable 的列。我的主要问题是我不知道我可能有多少列。

我有一个获取字段文本的类的引用。我还有一个包含每个字段顺序的字典,其中包含确切的属性它应该从中获取数据。

我的代码应该是这样的:

var docsRes3 = from d in docs
                       select new[] 
                       {  
                           for (int i=0; i<numOfCols; i++)
                           {
                               gen.getFieldText(d, res.FieldSourceDic[i]);
                           }
                       };

其中:
docs = 我只想从中获取特定字段 的
列表 res.FieldSourceDic = 字典,其中键是列的顺序,值是属性
gen.getFieldText = 获取实体和属性的函数和返回值

显然,它不起作用。

我也试过

StringBuilder fieldsSB = new StringBuilder();
        for (int i = 0; i < numOfCols; i++)
        {
            string field = "d." + res.FieldSourceDic[i] + ".ToString()";
            if (!string.IsNullOrEmpty(fieldsSB.ToString()))
            {
                fieldsSB.Append(",");
            }
            fieldsSB.Append(field);
        }


        var docsRes2 = from d in docs
                       select new[] { fieldsSB.ToString() };

它也没有工作。

到目前为止,唯一对我有用的是:

List<string[]> docsRes = new List<string[]>();
        foreach (NewOriginDocumentManagment d in docs)
        {
            string[] row = new string[numOfCols];

            for (int i = 0; i < numOfCols; i++)
            {
                row[i] = gen.getFieldText(d, res.FieldSourceDic[i]);
            }

            docsRes.Add(row);
        }

知道如何将 linq 传递给字段列表,它会有效地从中删除所需的数据吗?

谢谢,锄头我很清楚我需要什么....

4

2 回答 2

0

尝试以下操作:

var docsRes3 = from d in docs
               select ( 
                   from k in res.FieldSourceDic.Keys.Take(numOfCols)
                   select gen.getFieldText(d, res.FieldSourceDic[k]));
于 2013-04-14T12:46:49.927 回答
0

我从以下链接得到了一些帮助:http: //www.codeproject.com/Questions/141367/Dynamic-Columns-from-List-using-LINQ

首先,我创建了一个包含所有属性的字符串数组:

//Creats a string of all properties as defined in the XML
        //Columns order must be started at 0. No skips are allowed
        StringBuilder fieldsSB = new StringBuilder();
        for (int i = 0; i < numOfCols; i++)
        {
            string field = res.FieldSourceDic[i];
            if (!string.IsNullOrEmpty(fieldsSB.ToString()))
            {
                fieldsSB.Append(",");
            }
            fieldsSB.Append(field);
        }
        var cols = fieldsSB.ToString().Split(',');

        //Gets the data for each row dynamically
        var docsRes = docs.Select(d => GetProps(d, cols));

比我创建了 GetProps 函数,该函数使用我自己的函数,如问题中所述:

private static dynamic GetProps(object d, IEnumerable<string> props)
    {
        if (d == null)
        {
            return null;
        }

        DynamicGridGenerator gen = new DynamicGridGenerator();
        List<string> res = new List<string>();

        foreach (var p in props)
        {
            res.Add(gen.getFieldText(d, p));
        }

        return res;
    }
于 2013-04-14T13:28:44.270 回答