2

目前,我正在使用三个数据库查询在我的 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”的调用中的类型推断失败。

不管它是什么意思。

4

2 回答 2

0

使用 DataLoadOptions 类的 LoadWith 方法生成单个查询,如果可以通过外键关系对所有相关数据进行 Linq,则在其中加载所有相关数据,请在此处阅读更多信息。

如果没有这样的关系,那么您可以使用 DataContext 实现连接查询:在此处阅读更多:使用 lambda 表达式连接 2 和 3 表的简单示例

于 2013-07-10T17:12:53.527 回答
0

我认为不可能一次性通过 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

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

于 2013-07-10T17:26:35.917 回答