Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq Dynamics将N添加到我的参数中_C#_Entity Framework_Linq_Parameters_Entity Framework 6 - Fatal编程技术网

C# Linq Dynamics将N添加到我的参数中

C# Linq Dynamics将N添加到我的参数中,c#,entity-framework,linq,parameters,entity-framework-6,C#,Entity Framework,Linq,Parameters,Entity Framework 6,我正在使用System.Linq.Dynamic开发自定义过滤器,在开始使用和之间的斗争之前,一切都正常 我创建了一个名为Filtro的自定义类,它具有以下属性 public string PropertyName { get; set; } public string Value1 { get; set; } public string Value2 { get; set; } 然后,我基本上用该类的参数过滤一个IQueryable对象 我正在尝试这个: var query = db.Whe

我正在使用
System.Linq.Dynamic
开发自定义过滤器,在开始使用
之间的斗争之前,一切都正常

我创建了一个名为
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);
当我生成不带参数的查询时

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

var query=db.Where(“example>10&&example问题在于动态Linq假设您传入的
example
值是一个值而不是列名。因此查询不返回行,因为字符串
example
不在字符串
10
20
之间

N'
前缀是完全正常的SQL语法,它只是将字符串强制为
NVARCHAR
类型,而不是
VARCHAR
。有关详细信息,请参阅。但是,对于您的代码,请尝试以下示例:

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

注意:这会使您面临SQL注入,因此非常危险。

前缀
N'
有什么问题?那就是。它会导致您的查询失败吗?@DavidG查询返回0行:S@PeterBonswierd是正常的Linq不加字符的
N
可能,问题是它不能识别第二个和第三个字符d参数作为数字,如果我将它们作为数字传递,它会抛出一个异常:SYeah似乎不合逻辑。无论如何,我不会考虑太多。这里没有什么问题。谢谢!但是,有没有其他解决方案可以避免sql注入?你能指导我调查吗?我对动态Linq不太熟悉不幸的是,我更喜欢使用<代码>表达式
s。
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
var sql = $"{filtro.PropertyName} > @0 AND {filtro.PropertyName} < @1";
var query = db.Where(sql, filtro.Value1, filtro.Value2);