如何将多个查询更改为单个查询?

时间:2012-10-14 15:25:34

标签: c# entity-framework linq-to-entities

我有三个表,即“项目”,“平台”,“详细信息”。

我从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?>();
}

你能帮我把所有的查询写在一行吗?

1 个答案:

答案 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?>();
    };
}

您不会看到对数据库的调用减少,但如果您要使用的是具有这些值的单个记录,那么这将实现它。