c# - 用 Linq 替换在 asp.net 中编写的旧 sql

标签 c# asp.net asp.net-mvc linq

我试图用 LINQ 替换 SQL 代码以便迁移到 MVC,但我不知道如何在 LINQ 中使用子查询。截至目前,我已经用 LINQ 替换了内部 sql 查询,我想知道如何处理外部查询。

以下是SQL查询

SELECT
    DISTINCT GP_REGION.REGION_MAIN Region_Code,
    R1.REGION_NAME 
FROM
    GP_REGION 
    INNER JOIN GP_REGION R1 ON GP_REGION.REGION_MAIN = R1.REGION_CODE 
WHERE
    GP_REGION.REGION_HAS_DATA = 'Y'
    AND
    GP_REGION.REGION_MAIN IN 
    (
        SELECT
            DISTINCT AR.BRANCH_CODE 
        FROM
            PORTAL.UA_APPLN_ROLE AR 
            INNER JOIN PORTAL.UA_GROUP G ON AR.GROUP_CODE = G.GROUP_CODE
        WHERE
            G.USER_ID = '" + Global.UserId() + "' AND AR.APPLICATION_ID = '" + ApplicationId + "'
     )
 ORDER BY
     GP_REGION.REGION_MAIN

在这里,我使用以下 LINQ 替换了内部查询,如下所示

var regions = from p in db3.UA_APPLN_ROLE.AsEnumerable()
              join i in db3.UA_GROUP.AsEnumerable()
                  on p.GROUP_CODE equals i.GROUP_CODE
              where
                  i.USER_ID == Global.UserId()
                  &&
                  p.APPLICATION_ID == ConfigurationManager.AppSettings["ApplicationId"]

              select new
              {
                  branchcode = p.BRANCH_CODE
              };

但我想知道外部 sql 查询如何替换并加入我编写的现有 LINQ 代码

最佳答案

您将子查询组合到主查询中,如下所示:

  var efQuery = from gp in db3.GP_REGION
                join r1 in db3.GP_REGION on gp.REGION_MAIN equals r1.REGION_CODE 
                where regions.Contains(gp.REGION_MAIN)
                   && gp.REGION_HAS_DATA = "Y"
                select new
                {
                    Region_Code = gp.REGION_MAIN,
                    Region_Name = r1.REGION_NAME 
                };
  var queryResult = efQuery.Distinct().OrderBy(x => x.Region_Code);

您可以使用 .AsNoTracking() 加快处理速度,例如db3.GP_REGION.AsNoTracking()

一般来说,监控生成的 SQL 查询是个好主意,以避免它在代码中看起来很简单,但却被转换成糟糕的 SQL 的情况。

但在我看来,让查询成为代码中的一流成员(与字符串中的 SQL 相比)的优势超过了有时生成的非直观 SQL。

关于c# - 用 Linq 替换在 asp.net 中编写的旧 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30357553/

相关文章:

javascript - 如何使用 .NET (C#) 或 JavaScript 获取 .MP4 播放长度?

jquery - 为什么 jquery 需要一个 ui 对话框的选择器

c# - 如何使用 XAML 中的资源值和绑定(bind)值格式化字符串?

c# - 如何使用 Jquery Mobile 在 MVC 中动态创建带有 Count Bubbles 的链接

c# - 如何在不向服务器提交 SQL 语句的情况下获取 SqlParameter 的字符串表示形式?

c# - XPath 扩展方法在 .NET 3.5 中失败,在 .NET 4.0 中有效

c# - 使用隐藏字段是个好主意吗? (ASP.NET, C#)

c# - 在 ASPX 中定义自定义对象时出现 NullReferenceException

c# - 使用通过 Unity 注入(inject)的共享实体时如何生成子线程进程?

c# - Action 链接到另一个 View (MVC)