使用实体框架和linq,我希望从数据库中的3个不同表中返回3个不同的结果集。这些表基本上包含填充视图模型选择列表的查找值。目前,我必须对数据库进行3次单独调用,以检索每个项目列表。我可以将其减少到一个电话吗?
我已经尝试了以下操作,但是没有用:
mysql> mysqldump --databases database-name --host instance-IP --user=user-name --password
答案 0 :(得分:0)
假设三个表Duration
,Types
和Platforms
以任何方式无关:
考虑使用单个SELECT
语句的SQL查询如何查询所有三个表。您找不到符合您需求的产品。
因此,在这种情况下,创建三个不同的查询是绝对合理的。但是,您可以做和应该做的是,对三个查询使用相同的dbContext
实例。
var durationsList = await dbContext.Durations.ToListAsync();
var typesList = await dbContext.Types.ToListAsync();
var platformsList = await dbContext.Platforms.ToListAsync();
答案 1 :(得分:0)
如果减少数据库往返是你所追求的, 您可以使用Future()(Z.EntityFramework.Plus的一部分)批量处理您的请求
var durationsFuture = dbContext.Durations.Future();
var typesFuture = dbContext.Types.Future();
var platformsFuture = dbContext.Platforms.Future();
var durationsList = durationsFuture.ToList(); // this line will retrieve all 3 collections
var typesList = typesFuture.ToList();
var platformsList = platformsFuture.ToList();
答案 2 :(得分:-1)
逻辑上,您应该对SQL进行3次单独查询。 使这3个调用填充不相关的查找值完全没有错。
但是如果你绝对想要避免3个DB调用(相当于一个包含3个SELECT语句的SPROC)
注意:这是一个笛卡尔积,适用于所有3个表。
你可以在LINQ查询之后尝试这个吗...我们试图得到这3个表的笛卡尔积(真实条件)并投射出3个表而没有任何关系。
var lists = await dbContext.Durations.Join(dbContext.Types, d => true, t => true,
(d, t) => new { d, t })
.Join(dbContext.Platforms, dt => true, p => true,
(dt, p) => new
{
Duration = dt.d,
Type = dt.t,
Platform = p
})
.Distinct()
.ToListAsync();