Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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 To Sql将实际值嵌入到查询中,而不是将它们作为参数传递?_C#_.net_Linq To Sql_Parameter Sniffing - Fatal编程技术网

C# 我是否可以让Linq To Sql将实际值嵌入到查询中,而不是将它们作为参数传递?

C# 我是否可以让Linq To Sql将实际值嵌入到查询中,而不是将它们作为参数传递?,c#,.net,linq-to-sql,parameter-sniffing,C#,.net,Linq To Sql,Parameter Sniffing,我有以下代码: IQueryable<SomeType> allItems = ...; var selectedItems = allItems.Where( item => ( item.State == 1 || item.State == 3 ) ); Console.WriteLine( selectedItems.ToString() ); IQueryable allItems=。。。; var selectedItems=allItems.Where(item

我有以下代码:

IQueryable<SomeType> allItems = ...;
var selectedItems = allItems.Where( item => ( item.State == 1 || item.State == 3 ) );
Console.WriteLine( selectedItems.ToString() );
IQueryable allItems=。。。;
var selectedItems=allItems.Where(item=>(item.State==1 | | item.State==3));
Console.WriteLine(selectedItems.ToString());
我得到以下查询:

SELECT [t0].[ItemId], [t0].[State], <other columns>
FROM [Items] AS [t0]
WHERE [t0].[State] = @p0 OR [t0].[State] = @p1
选择[t0].[ItemId],[t0].[State],
从[项目]到[t0]
其中[t0].[State]=@p0或[t0].[State]=@p1
您可以看到,实际值1和3不会插入到查询中,而是作为参数传递,这通常会导致选择次优执行计划


如果[t0].[State]=1或[t0].[State]=3,我是否可以让Ling To Sql发出

在Linq To Sql按照所述和生成Sql后,有两种方法可以操作Sql,但我不建议使用这两种方法,因为它们很可能会很脆弱

参数化sql是使用orm(如LINQtoSQL或实体框架)的主要好处之一,这可以防止。Sql server还将缓存参数化Sql的执行计划,从而提高应用程序的总体性能


这是一篇关于参数化sql的好处的好文章。

我怀疑你能否强迫它生成常量来代替参数:他们认为参数更好,所以他们在任何地方都使用参数。您可以尝试
item=>new[]{1,3}.Contains(item.State)
,但我怀疑您会在SQL中(@p0,@p1)
中获得
。是的,当我这样做的时候,我正好在(@p0,@p1)
中获得
。那么您认为LINQ应该接受SQL注入攻击吗@Bum:注入一个数字到底会导致什么样的意外行为?SQL注入攻击有很好的文档记录。这一点都不好笑。我知道什么是SQL注入。在我的例子中,这些值保证被清除。当您有一个过滤索引(例如
其中x=1和y=2
)时,这可能很有用,但如果这些是参数,除非列是索引本身的一部分,否则索引不会提取它们