gpt4 book ai didi

c# - Linq Dynamics 在我的参数中添加了一个 N

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:19 25 4
gpt4 key购买 nike

我正在使用 System.Linq.Dynamic 开发自定义过滤器,一切正常,直到我开始使用 BETWEEN 进行战斗。

我创建了一个名为 Filtro 的自定义类,它具有以下属性。

public string PropertyName { get; set; }
public string Value1 { get; set; }
public string Value2 { get; set; }

然后,我基本上用那个类的参数过滤一个IQueryable对象

我正在尝试这个:

var query = db.Where("@0 > @1 AND @0 < @2", filtro.PropertyName, filtro.Value1, filtro.Value2);

我的问题是查询中的参数生成不正确。

例子:

filtro.PropertyName = "example";
filtro.Value1 = "10";
filtro.Value2 = "20";

当我生成不带参数的查询时

var query = db.Where("example>10 && example<20");

它生成这个:

SELECT 
[Extent1].[randomField] AS [randomField],
[Extent1].[example] AS [example],
FROM [dbo].[Transformador] AS [Extent1]
WHERE ([Extent1].[example] > cast(10 as decimal(18))) AND ([Extent1].[example] < cast(20 as decimal(18)))
ORDER BY [Extent1].[randomField] ASC}

但是当我使用参数时(正如我之前展示的那样)我得到了这个

SELECT 
[Extent1].[randomField] AS [randomField],
[Extent1].[example] AS [example]
FROM [dbo].[Transformador] AS [Extent1]
WHERE (N'example' > N'10') AND (N'example' < N'20')
ORDER BY [Extent1].[randomField] ASC

我想我使用的 Linq Dynamics 参数有误,但我没有在互联网上找到任何类似的东西

我希望有人知道问题是什么,在此先感谢!

最佳答案

问题是 Dynamic Linq 假定您传入的 example 值是一个 而不是 名称。因此查询不返回任何行,因为字符串 example 不在字符串 1020 之间。

N' 前缀是完全正常的 SQL 语法,只是将字符串强制转换为 NVARCHAR 类型,而不是 VARCHAR。参见 this获取更多信息。但是,对于您的代码,请尝试以下示例:

var sql = $"{filtro.PropertyName} > @0 AND {filtro.PropertyName} < @1";
var query = db.Where(sql, filtro.Value1, filtro.Value2);

注意:这会让您面临 SQL 注入(inject),因此非常危险。

关于c# - Linq Dynamics 在我的参数中添加了一个 N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51176768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com