Linq 是否可以从DataContext.ExecuteQuery返回匿名对象的IEnumerable?
我开发了一个基于模板的报告引擎。每个模板都有SQL查询字符串,每个报表都有SQL查询参数的特定值。为了呈现报告,我设置参数并调用方法来获取记录列表。但要捕获返回的列,我必须知道它们的名称,并拥有一个具有相应属性的类 是否可以从DataContext.ExecuteQuery返回匿名对象的IEnumerable,然后使用反射确定其属性 我需要一个LINQ等效物 谢谢 是的,你能做到。 请看一下这个片段Linq 是否可以从DataContext.ExecuteQuery返回匿名对象的IEnumerable?,linq,linq-to-sql,anonymous-types,Linq,Linq To Sql,Anonymous Types,我开发了一个基于模板的报告引擎。每个模板都有SQL查询字符串,每个报表都有SQL查询参数的特定值。为了呈现报告,我设置参数并调用方法来获取记录列表。但要捕获返回的列,我必须知道它们的名称,并拥有一个具有相应属性的类 是否可以从DataContext.ExecuteQuery返回匿名对象的IEnumerable,然后使用反射确定其属性 我需要一个LINQ等效物 谢谢 是的,你能做到。 请看一下这个片段 class Program { static void Main(string[
class Program {
static void Main(string[] args) {
var persons = new Person[]{
new Person{Age=22,Name="John Doe",Id=1},
new Person{Age=23,Name="Jack Smith", Id=2},
new Person{Age=34,Name="Sara Parker", Id=3}
};
var anonData = GetAnonTypes(persons);
foreach (var item in anonData as IEnumerable) {
//use reflection to access propties
}
}
static object GetAnonTypes(IEnumerable<Person> persons) {
var query=from p in persons select new{
Id=p.Id,
Name=p.Name
};
return query;
}
}
public class Person {
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
直到我们有了带有dynamiС关键字的C4.0,我们才可以使用这个解决方案,该解决方案稍微修改了Octavio Hernández Leal的一篇文章中的代码:
public static class DataContextExtension
{
public static IEnumerable<Dictionary<string, object>> ExecuteQuery(this DataContext dataContext, string query)
{
using (DbCommand command = dataContext.Connection.CreateCommand())
{
command.CommandText = query;
dataContext.Connection.Open();
using (DbDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (reader.Read())
{
Dictionary<string, object> dictionary = new Dictionary<string, object>();
for (int i = 0; i < reader.FieldCount; i++)
dictionary.Add(reader.GetName(i), reader.GetValue(i));
yield return dictionary;
}
}
}
}
}
此扩展方法返回字典对象的IEnumerable,其中键是查询列的名称。不幸的是,这没有帮助。我需要DataContext.ExecuteQuery中匿名对象的IEnumerable,它需要一些类型作为参数。在我们12年后仍在使用的系统上工作得很好。。。