6

我想从List以下动态选择列。那么最好的方法是什么?

//a objects list
List<DashBoard> dashboardlist = (List<DashBoard>)objList;  
string strColumns = "RecDate,ModifiedDate";
objList = (from obj in dashboardlist select new { strColumns }).ToList();

//////////// 好的,忘记对象列表说我有数据库表,其中包含列 ID、名称、年龄、性别等的数量 ..然后我有 columnList 要显示,而 columnList 是根据情况改变。所以我列出了人;并列出列模板;所以现在我想根据模板选择列。

4

4 回答 4

7

感谢您为我的问题提供想法。在 Google 上花了几个小时我找到了解决方案

public void Test() {
    var data = new[] {
        new TestData { X = 1, Y = 2, Z = 3 }
    ,   new TestData { X = 2, Y = 4, Z = 6 }
    };
    var strColumns = "X,Z".Split(',');
    foreach (var item in data.Select(a => Projection(a, strColumns))) {
        Console.WriteLine("{0} {1}", item.X, item.Z);
    }
}
private static dynamic Projection(object a, IEnumerable<string> props) {
    if (a == null) {
        return null;
    }
    IDictionary<string,object> res = new ExpandoObject();
    var type = a.GetType();
    foreach (var pair in props.Select(n => new {
        Name = n
    ,   Property = type.GetProperty(n)})) {
        res[pair.Name] = pair.Property.GetValue(a, new object[0]);
    }
    return res;
}
class TestData {
    public int X { get; set; }
    public int Y { get; set; }
    public int Z { get; set; }
}
于 2012-11-23T05:55:15.583 回答
1

我假设列的列表可能来自外部资源并发生变化,我建议:

通过反射,您可以生成与每个 Column 对应的 FieldInfo 列表,然后遍历列表中的每个项目和每个 FieldInfo 并在数据对象上调用 GetValue。

于 2012-11-22T12:34:14.020 回答
0

这是解决方案: 使用 LINQ 动态选择列? 并查看动态 Linq:http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

于 2012-11-22T12:42:35.970 回答
0

假设您只有 2 个模板。您可以为每个模板创建一个方法,该方法仅返回您需要的列。像这样的东西:

// method for template 1 - returns only 3 columns/properties
private DashBoard CreateDashBoardXxxxxxx(DashBoard item)
{
    return new DashBoard {
        Property1 = item.Property1,
        Property4 = item.Property2,
        Property3 = item.Property3
    };
}

// method for template 2 - returns N columns/properties
private DashBoard CreateDashBoardYyyyyyyy(DashBoard item)
{
    return new DashBoard {
        Property1 = item.Property1,
        Property4 = item.Property2,

        // Other properties
        // .....

        PropertyN = item.PropertyN
    };
}

然后,您可以像这样使用这些方法:

List<DashBoard> dashboardlist = (List<DashBoard>)objList; 

// using template 1
var list = dashboardlist.Select(CreateDashBoardXxxxxxx);

// using template 2
var list2 = dashboardlist.Select(CreateDashBoardYyyyyyyy);

你只需要做一些代码来决定应该使用哪个模板。

我希望这有帮助!!

于 2012-11-22T13:59:41.070 回答