0

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

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

您能帮我在一行中编写上述所有查询吗?

4

1 回答 1

0

您可以为要在语句中获取的每个值创建一个相关子查询select,如下所示(在 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-to-Entities 调用它。

另一种方法是,如果您真的在寻找一个存储这些值的记录,则将它们存储在一个类型中。以下是如何以匿名类型执行此操作:

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

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

于 2012-10-14T15:40:15.640 回答