我有三个表,即“项目”,“平台”,“详细信息”。
我从Projects表中收集了详细信息,然后收集了Platforms表和Details表。从详细信息表中我们可以获得多个值或单个值。
我已经编写了Linq查询,如下所示:
using (PEntities CSProject = new PEntities())
{
projectId = (from _project in CSProject.Projects
where _project.ProjectName == project
select _project.ProjectId).SingleOrDefault();
platformId = (from platformID in CSProject.Projects
where platformID.ProjectName == project
select platformID.PlatformId).SingleOrDefault();
platformName = (from platfrmName in CSProject.Platforms
where platfrmName.PlatformId == platformId
select platfrmName.PlatformName).SingleOrDefault();
cSProjectId = (from _csproject in CSProject.Details
where _csproject.ProjectId == projectId
select _csproject.CsprojectId).ToList<long?>();
}
你能帮我把所有的查询写在一行吗?
答案 0 :(得分:0)
您可以为select
语句中的每个值创建correlated subquery,如此(在SQL中):
select
(select ProjectId from Projects where ProjectName = @project) as ProjectId,
(select PlatformId from Projects where ProjectName = @project) as PlatformId,
...
在SQL中,上面不需要一个表来查询(它会返回一行),但是你需要LINQ-to-Entities中的东西,它会强制你查询一个上下文,确保表格中至少有一个值,等等。
毋庸置疑,它不值得,虽然您对数据库的调用次数较少,但发送的实际查询将非常复杂。
那就是说,你最好做两件事之一。第一种是创建一个存储过程,创建相关的子查询并返回上面的一条记录,并从LINQ到实体调用它。
另一方面,如果您真的在寻找存储这些值的记录,那么将它们存储在一个类型中。以下是如何以匿名方式执行此操作:
using (PEntities CSProject = new PEntities())
{
var results = new {
ProjectId = (
from _project in CSProject.Projects
where _project.ProjectName == project
select _project.ProjectId).SingleOrDefault(),
PlatformId = (
from platformID in CSProject.Projects
where platformID.ProjectName == project
select platformID.PlatformId).SingleOrDefault(),
PlatformName = (
from platfrmName in CSProject.Platforms
where platfrmName.PlatformId == platformId
select platfrmName.PlatformName).SingleOrDefault();
CsProjectId = (
from _csproject in CSProject.Details
where _csproject.ProjectId == projectId
select _csproject.CsprojectId).ToList<long?>();
};
}
您不会看到对数据库的调用减少,但如果您要使用的是具有这些值的单个记录,那么这将实现它。