动态选择使用Linq获取哪些属性

时间:2013-04-14 11:47:37

标签: linq dynamic-programming

我有一个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传递给字段列表并且它会有效地从中删除所需的数据?

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

2 个答案:

答案 0 :(得分:0)

请尝试以下操作:

var docsRes3 = from d in docs
               select ( 
                   from k in res.FieldSourceDic.Keys.Take(numOfCols)
                   select gen.getFieldText(d, res.FieldSourceDic[k]));

答案 1 :(得分: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;
    }