【问题标题】:Retrieve multiple tables by one Linq-to-Sql query通过一个 Linq-to-Sql 查询检索多个表
【发布时间】:2017-05-08 06:05:15
【问题描述】:

目前我正在使用 三个 数据库查询在我的 MVC 应用程序中填充一个模型。

这是怎么回事:

IndexViewModel model = new IndexViewModel();

model.Links = Repository.GetAll().ToArray();
model.SourceOne = StaffMembersRepository.GetAll().ToArray();
model.SourceTwo = CategoriesRepository.GetAll().ToArray();

return model;

我希望只做一个查询(为了更好的性能),它应该返回三个表的所有行。

我不能进行内部连接,因为这三个表根本没有(假设它们没有)连接。

我试过了

var result = from link in Repository.GetAll()
             from staffMember in StaffMembersRepository.GetAll()
             from category in CategoriesRepository.GetAll()
             select new { link, staffMember, category };

但是有一个编译错误突出显示“CategoriesRepository.GetAll()”这段代码说:

源类型为“System.Linq.IQueryable”的查询表达式的后续 from 子句中不允许使用“System.Linq.IQueryable”类型的表达式。调用“SelectMany”时类型推断失败。

不管那是什么意思。

【问题讨论】:

  • 在 SQL 中只使用一个查询就不可能从三个表中检索数据(好吧,除了联合查询,但这是一种特殊情况)。是什么让您认为在后台生成 SQL 的 LINQ 可以做到这一点?是什么让您认为单个 LINQ 语句的性能会更好?

标签: c# linq-to-sql


【解决方案1】:

我认为不可能一次性通过 LINQ 检索完全不相关的表。也许出于性能原因,您应该考虑缓存,这样您就不需要每次都查询数据库。

在 MSSQL 上使用普通 SQL,您可以使用批处理语句。

var batchSql = "select * from Repository; select * from StaffMembersRepository; select * from CategoriesRepository";
// ...
// iterate over batch results
using(var reader = command.ExecuteReader())
{
    var currentResultSet = 0;
    while(reader.NextResult())
    {
        currentResultSet++;
        switch(currentResultSet)
        {
            case 1:
                while(reader.Read())
                {
                    // retrieve row data
                }
            case 2:
                // similar
            case 3:
                // similar
        }
    }
}

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.nextresult.aspx

但我不认为这是一个好方法。

【讨论】:

    【解决方案2】:

    使用 DataLoadOptions 类的 LoadWith 方法生成单个查询,如果可以通过外键关系对所有相关数据进行 Linq 编辑,则在该查询中加载所有相关数据,阅读更多 here

    如果没有这样的关系,那么您可以使用您的 DataContext 实现连接查询: 在这里阅读更多:Simple Examples of joining 2 and 3 table using lambda expression

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多