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
Tsql linq语句生成的(x,y,z)中的Where Id的替代项_Tsql_Entity Framework_Ef Code First - Fatal编程技术网

Tsql linq语句生成的(x,y,z)中的Where Id的替代项

Tsql linq语句生成的(x,y,z)中的Where Id的替代项,tsql,entity-framework,ef-code-first,Tsql,Entity Framework,Ef Code First,创建linq查询时,如下所示: var ids = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var q = from r in context.Table where ids.Contains(r.Id) select r; 总的来说,这就是我所期望的,尽管它确实会搞乱“查询计划编译”,因为每个查询都是不同的,因此需要在执行之前进行编译 由于EF在其他方面非常擅长使用变量(@p_linq_)来

创建linq查询时,如下所示:

var ids = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var q = from r in context.Table
        where ids.Contains(r.Id)
        select r;
总的来说,这就是我所期望的,尽管它确实会搞乱“查询计划编译”,因为每个查询都是不同的,因此需要在执行之前进行编译

由于EF在其他方面非常擅长使用变量(@p_linq_)来避免这种情况,因此它(默认情况下)不会对此类查询执行此操作

有可能避免这种情况吗

表值参数浮现在脑海中,但目前还不受支持


顺便说一句:在现实生活中,查询要复杂得多,ids列表中的项数要长得多,但仍然需要过滤掉数据。我们不想在“客户端”上进行过滤。

我曾经通过修改EF生成的TSQL来实现这一点,以发出一个xml字符串参数,该参数作为表值参数I进行计算n查询本身

这样做的影响并不像我所希望的那么大,虽然在某些方面的性能有了很大的提高,但其他的查询以前表现得非常好,现在却表现得非常糟糕

最终,我们通过将自定义Contains方法映射为模型定义的函数,将实现切换到optin方法(http://blogs.msdn.com/b/efdesign/archive/2009/01/07/model-defined-functions.aspx).所以用法是

    var ids = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    var q = from r in context.Table
    where CriteriaHelpers.Contains(ids, r.Id)
    select r;
这种方法还具有绕过2100参数限制的额外好处

    var ids = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    var q = from r in context.Table
    where CriteriaHelpers.Contains(ids, r.Id)
    select r;
SELECT ... FROM Table
WHERE Id IN (SELECT Entity.ID.value('.', 'Id') AS ID FROM @parameterName.nodes('/items/i') AS Entity(ID))