如何使用动态数据

时间:2017-11-08 06:43:13

标签: c# linq lambda expression

如何在动态数据中投放IEnumerableIEnumerable<T>,无论是intobject还是string

这就是我获取实际数据的方式:

List<Orders> order = new List<Orders>();
Customer[] cs = { new Customer { CustNum = 5, OtherAddress = "Hello" }, new 
Customer { CustNum = 986, OtherAddress = "Other" } };
Customer[] cso = { new Customer { OtherAddress = "T", CustNum = 5 }, new 
Customer { CustNum = 777, OtherAddress = "other" } };
order.Add(new Orders(code + 1, "ALFKI", i + 0, 2.3 * i, "Mumbari", "Berlin", cs));
order.Add(new Orders(code + 2, "ANATR", i + 2, 3.3 * i, "Sydney", "Madrid", cso));
order.Add(new Orders(code + 3, "ANTON", i + 1, 4.3 * i, "NY", "Cholchester", cs));
order.Add(new Orders(code + 4, "BLONP", i + 3, 5.3 * i, "LA", "Marseille", cso));
order.Add(new Orders(code + 5, "BOLID", i + 4, 6.3 * i, "Cochin", "Tsawassen", cs));

我想将此IEnumerable数据转换为IEnumerable<T>

我只是用PerformComplexDataOperation(order , "customer")

调用该函数
private IQueryable PerformComplexDataOperation(this IEnumerable dataSource, string select)
{
    Type T = dataSource.GetElementType();
    IQueryable<T> data = dataSource.AsQueryable().Cast<typeof(dataSource)>();
    return data;
}

需要在其中执行一些其他操作。我只是粘贴我的代码概述

1 个答案:

答案 0 :(得分:3)

通常只有在编译时能够知道类型时才使用泛型。例如,Select上的LINQ IEnumerable<T>扩展方法有两个通用参数 - 源类型和结果类型。

编写代码时,编译器&#34;知道&#34;源类型和结果类型基于您编写代码的方式:

var lst = new List<int>() {1,2,3};
var query = lst.Select(x => x.ToString();

//the compiler fills in the generic type parameters as follows:
var query = lst.Select<int,string>(x => x.ToString());

如果在编译时您知道类型,那么您可以Cast IEnumerable / IQueryable到适当的编译时类型:

IEnumerable lst = new List<int>() {1,2,3};
var query = lst.Cast<int>().Select(x => x*x);

或者更好的是,没有必要将变量限制为非泛型IEnumerable;您可以使用上述var,或明确键入变量:

IEnumerable<int> lst = new List<int>() {1,2,3};

但是,我怀疑你在编译时并不知道这种类型,在这种情况下,仿制药不会帮助你。 1

在这种情况下,您可以使用System.Linq.Dynamic.Core库,它允许您通过传入字符串而不是委托/表达式来使用LINQ方法。例如:

// assuming your Orders type has a Customer property
var query = data.AsQueryable().Select("Customer");

字符串表达式可能更复杂,例如使用.运算符导航属性,使用[...]进行数组索引:

// For each Order, will return the OtherAddress of the first Customer
var query = data.AsQueryable().Select("Customers[0].OtherAddress");

1。实际上,如果你真的想要,可以使用反射和System.Linq.Expressions.Expression的组合来构建你自己的表达式。