我有以下情况,效果很好:
IQueryable<Experiment> experiments1 = _db.Experiments.Where(e => e.Projects.Any(p => p.Id == project.Id));
IQueryable<Experiment> experiments2 = _db.Experiments.Where(e => e.Tools.Any(m => m.Project.Id == project.Id));
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
{
e.Id,
e.Name,
e.Date
}).ToList();
通过检查SQL,这将转换为从联合中正确提取Id、Name和Date的1 SQL查询。
当我使用多到多个连接表执行连接时,就会出现问题:
var experimentsList = experiments1.Union(experiments2).OrderBy(e => e.Date).Select(e => new
{
e.Id,
e.Name,
e.Date,
e.Types.Select(t => t.Name)
// or also just e.Types
}).ToList();
由于某些原因,生成的SQL查询不仅返回“需要”列,而且返回--实验表中的所有列+附加的指定列(即类型的名称)。
这在表演上造成了相当大的损失。
顺便说一句,在我稍后需要执行的代码中:
experimentsList.Select(e => new
{
e.Id,
e.Name,
e.Date,
Types = string.Join(", ", e.Types)
})
因此,我需要更快的方式,在内存Id,名称,日期+一个类型列表。
谢谢!
发布于 2018-11-12 06:21:29
你能试试这个吗?列名可能需要更改。
var result = from exp in _db.Experiments
join t in _db.Types on exp.TypeID = t.Id
select new
{
exp.Id,
exp.Name,
exp.Date,
t.Name
}).ToList();
https://stackoverflow.com/questions/53263926
复制相似问题