Ben*_*ack 4 linq sql-server linq-to-sql
LINQ to SQL在翻译我的一个查询时做了很糟糕的工作,所以我手工重写了它.问题是重写必然涉及一个IN条款,我不能为我的生活弄清楚如何ExecuteQuery为此目的传递集合.我在这里看到的唯一可以提出的就是使用string.Format整个查询字符串来克服它 - 但这会阻止查询在查询缓存中结束.
这样做的正确方法是什么?
注意:请注意我使用的原始SQL传递给 ExecuteQuery.我在第一句话中说过.告诉我使用Contains是没有用的,除非你知道一种混合Contains原始SQL的方法.
在Cheezburger.com上,我们经常需要将AssetID或UserID列表传递给存储过程或数据库查询.
传递此列表的一种方法是使用动态SQL.
Run Code Online (Sandbox Code Playgroud)IEnumerable<long> assetIDs = GetAssetIDs(); var myQuery = "SELECT Name FROM Asset WHERE AssetID IN (" + assetIDs.Join(",") + ")"; return Config.GetDatabase().ExecEnumerableSql(dr=>dr.GetString("Name"), myQuery);
这是一件非常糟糕的事情:
';DROP TABLE Asset;SELECT '
并且我们的网站已经死了.但是,它确实具有以下优点:在DB端不需要额外的解码,因为资产ID是由查询解析器找到的.
SQL Server 2008增加了一项新功能:用户可以定义表值数据库类型.大多数其他类型是标量(它们只返回一个值),但表值类型可以包含多个值,只要值是表格.
我们定义了三种类型:varchar_array,int_array,和bigint_array.
CREATE TYPE bigint_array AS TABLE (Id bigint NOT NULL PRIMARY KEY)
Run Code Online (Sandbox Code Playgroud)
存储过程和以编程方式定义的SQL查询都可以使用这些表值类型.
Run Code Online (Sandbox Code Playgroud)IEnumerable<long> assetIDs = GetAssetIDs(); return Config.GetDatabase().ExecEnumerableSql(dr=>dr.GetString("Name"), "SELECT Name FROM Asset WHERE AssetID IN (SELECT Id FROM @AssetIDs)", new Parameter("@AssetIDs", assetIDs));
好处
缺点
本文是了解TVP的更多信息.
| 归档时间: |
|
| 查看次数: |
2070 次 |
| 最近记录: |