【问题标题】:Retrieving relational tables as IEnumerable from DataContext.ExecuteQuery<customobject>()从 DataContext.ExecuteQuery<customobject>() 以 IEnumerable 形式检索关系表
【发布时间】:2016-03-01 22:27:19
【问题描述】:

首先阅读:这是应用程序的一部分,它不控制它正在访问的数据库,因此实体框架是不可能的。这是一个非基于 Web 的工具,它将现有数据提取到内存中,但数据库已经创建,并且不受我们控制。

我有一个类,代表我想从多个表中检索的一组数据 (ClassA)

public class ClassA
{
   public int ID;
   public string Detail;
   public List<string> Objects
}

表格看起来像这样:

表1

THISID(int)  | SOMETHING1(nvarchar)| SOMETHING2(nvarchar) | OTHERID(int)
1            | foo1                | bar1                 | 99
2            | foo2                | bar2                 | 98

表 2

TABLE2ID(int) | OTHERID(int) | SOMETHING3(nvarchar)
100           | 99           | somethingA
101           | 99           | somethingB
102           | 99           | somethingC
103           | 98           | somethingA
104           | 98           | something D

我正在使用这样的数据上下文

string connectionString = (user passed in connection string)
string query = @"SELECT t1.THISID AS ID, t1.SOMETHING1 AS Detail, t2.SOMETHING3 AS Objects
                 FROM Table1 AS t1
                 JOIN Table2 AS t2
                 ON t1.OTHERID = t2.OTHERID";
using(DataContext dc = new DataContext(connectionString))
{
   List<ClassA> aClasses = dc.ExecuteQuery<ClassA>(query);
}

这显然不起作用,但我不确定是否有办法让 DataContext 或 LINQtoSQL 将查询返回的外部值视为列表(或集合或可枚举)。我知道当您像使用典型的 ORM 一样使用实体框架时,它会为您执行此操作,但是在这里我们将结果集映射到一个对象中,我不确定是否有一种机制可以将连接的数据视为列表中的列表生成的映射对象。

关于如何在一次访问数据库中做到这一点的任何想法? 或者是否有必要从 Table1 中获取第一部分并实例化对象,然后遍历它们并填写它们的列表并额外访问 Table2?

【问题讨论】:

    标签: c# sql .net sql-server linq


    【解决方案1】:

    我很想使用实体框架。我知道你特别说你不能,但听起来你的推理只是你不控制数据库,这意味着你不能先使用代码。但无论如何,这并不重要。

    您可以一次访问数据库,但它(当然)需要提取更多数据。

    无论如何,您都必须添加一个类。

    class FlatRow
    {
        public int Id { get; set; }
        public string Something1 { get; set; }
        public string Something3 { get; set; }
    }
    
    string connectionString = (user passed in connection string)
    string query = @"SELECT t1.THISID AS ID, t1.SOMETHING1 AS Detail, t2.SOMETHING3 AS Objects
                     FROM Table1 AS t1
                     JOIN Table2 AS t2
                     ON t1.OTHERID = t2.OTHERID";
    using(DataContext dc = new DataContext(connectionString))
    {
        List<FlatRow> flat = dc.ExecuteQuery<FlatRow>(query);
    
        var aClasses = flat
                           .GroupBy(c => new { c.Id, c.Something1 })
                           .Select(c => new ClassA
                                        {
                                            ID = c.Key.Id,
                                            Detail = c.Key.Something1,
                                            Objects = c.Select(x => x.Something3).ToList()
                                        })
                           .ToList();
    }
    

    基本上,将其拉平,然后将其分组到内存中。这就是 EF 会做的事情,它会为你做这件事。但这还不错,如果你需要的话。

    不过,我很想对每个表进行性能测试,然后将它们合并到内存中。您将切换到使用GroupJoin,并且您需要一个额外的逻辑点,但是您不会为具有多个Something3s 的实体冗余地提取所有Something1 数据。

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      相关资源
      最近更新 更多