【问题标题】:Convert LINQ query to SQL query [closed]将 LINQ 查询转换为 SQL 查询 [关闭]
【发布时间】:2021-01-28 18:17:54
【问题描述】:

我试图创建一个与下面附加的 linq 查询等效的存储过程。我想从运行此代码的存储库中调用该存储过程。

这是 Linq 查询:

var rates = _dbcontext.tableName
            .Where(x => x.Param1 == param1 && x.Param2 == param2 && x.Param3 == param3)
            .AsNoTracking()
            .Orderby(x => x.Weight)
            .ToList();

【问题讨论】:

  • 你已经尝试了什么?您面临哪些具体问题?感谢您考虑How do I ask a good question?和How to create a Minimal, Reproducible Example
  • 为什么要将其转换为 SQL?
  • @ChristianBaumann 我已经查询了一个大型数据集(200,000 条记录)并提高了效率,我已经为表建立了索引。这就是我尝试不同方法以及研究存储过程的原因。
  • 200K 行并不大,恕我直言,既然你有正确的索引,它应该运行得很快。 EF 有一些开销,对,但不确定转换这个特定的是否值得。当您需要它时,您仍然可以使用 Linq To EF(或 SQL)执行原始 SQL 查询。

标签: sql linq asp.net-core entity-framework-core


【解决方案1】:

(它不允许我把它放在 cmets 中)

select * 
from tableName 
where Param1 = @param1 and 
       Param2 = @param2 and 
       Param3 = @param3 
order by weight;

编辑:完整的存储过程创建代码(数据类型是虚构的):

CREATE PROCEDURE dbo.MyProcedure
    @param1 NVARCHAR(20),
    @param2 DATETIME,
    @param3 INT
AS
SELECT *
FROM tableName
WHERE Param1 = @param1
      AND Param2 = @param2
      AND Param3 = @param3
ORDER BY weight;

而且,它也可以是 TVF:

CREATE FUNCTION dbo.udf_MyFunction
(
    @param1 NVARCHAR(20),
    @param2 DATETIME,
    @param3 INT
)
RETURNS TABLE
AS
RETURN
(
    SELECT *
    FROM tableName
    WHERE Param1 = @param1
          AND Param2 = @param2
          AND Param3 = @param3
);

请注意,TVF 变体没有“排序依据”,但可以在另一个选择中使用,例如:

Select * 
from dbo.udf_MyFunction(N'Par1', '20210101', 5)
order by weight;

【讨论】:

  • 抱歉没用
  • @ShakerKamal,什么没用?我自然不知道你的真实字段名。你也定义了这些参数吗?
  • 他们应该如何定义这些参数?它们将如何有效?我们只看到一个没有任何上下文的小代码 sn-p。
  • @GertArnold,查看为 MS SQL Server 创建任何存储过程的文档。在这里,提供选择主体就足够了,因为 OP 听起来已经知道如何创建 SP。它就像 Create Procedure MyProcedure @ param1 nvarchar(10), @ param2 int, ... as select * from tableName where Param1 = @ param1 and Param2 = @ param2 and Param3 = @ param3 order by weight;
  • @GertArnold 和顺便说一句,您也可以创建一个 TVF(表值函数)。这些参数将是函数参数,而函数体将只是那个选择。
【解决方案2】:

到目前为止,我一直在使用 LinqPad (https://www.linqpad.net/),编写了我的查询并立即将其翻译成 SQL。像魅力一样工作!

【讨论】:

  • 嗨,我目前使用的是 Mac,找不到任何 mac 版本的 linqpad
  • @ShakerKamal,我也使用 Mac,我仍然喜欢 linqpad(真的是注册用户)。我在 Windows 中使用 LinqPad(通过并行虚拟 - 实际上它是我的日常生产环境)。对于 Mac,您可以尝试 rosylnpad(我没有尝试过,也不知道它与 LinqPad 相比如何)。
猜你喜欢
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多