Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 是否可以从DataContext.ExecuteQuery返回匿名对象的IEnumerable?_Linq_Linq To Sql_Anonymous Types - Fatal编程技术网

Linq 是否可以从DataContext.ExecuteQuery返回匿名对象的IEnumerable?

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[

我开发了一个基于模板的报告引擎。每个模板都有SQL查询字符串,每个报表都有SQL查询参数的特定值。为了呈现报告,我设置参数并调用方法来获取记录列表。但要捕获返回的列,我必须知道它们的名称,并拥有一个具有相应属性的类

是否可以从DataContext.ExecuteQuery返回匿名对象的IEnumerable,然后使用反射确定其属性

我需要一个LINQ等效物

谢谢

是的,你能做到。 请看一下这个片段

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年后仍在使用的系统上工作得很好。。。