我有一个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传递给字段列表并且它会有效地从中删除所需的数据?
谢谢,锄头我很清楚我需要什么......
答案 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;
}