Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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
将LINQ中的条件where子句转换回SQL时遇到问题_Sql_Linq_Conditional_Where Clause - Fatal编程技术网

将LINQ中的条件where子句转换回SQL时遇到问题

将LINQ中的条件where子句转换回SQL时遇到问题,sql,linq,conditional,where-clause,Sql,Linq,Conditional,Where Clause,我陷入了困境 我已经完成了一个时髦的LINQ语句,它在我的web应用程序中完成了这项工作,但现在我想在存储过程中使用它: var r = (from p in getautocompleteweightsproducts.tblWeights where p.MemberId == memberid && p.LocationId == locationid

我陷入了困境

我已经完成了一个时髦的LINQ语句,它在我的web应用程序中完成了这项工作,但现在我想在存储过程中使用它:

var r = (from p in getautocompleteweightsproducts.tblWeights
                     where p.MemberId == memberid &&
                              p.LocationId == locationid

                     select p);

            if (level != "0")
                r = r.Where(p => p.MaterialLevel == level);

            if (column == "UnitUserField1")
                r = r.Where(p => p.UnitUserField1 == acitem);

            if (column == "UnitUserField2")
                r = r.Where(p => p.UnitUserField2 == acitem);

return r.OrderBy(p => p.LevelNo).ToList();
然而,我的一生都不能让条件where子句起作用

如果有人能给我指出正确的方向,我将不胜感激


亲切问候

您是否尝试过,我非常确定上次玩时您可以输入“LINQ to SQL”代码并查看生成的SQL。如果做不到这一点,请在运行LinqTOSQL的代码上放置一个SQL跟踪/探查器,并在跟踪中查找正在执行的查询。

可能是这样的吗

SELECT *
FROM dbo.weights
WHERE member_id = @memberid
    AND location_id = @locationid
    AND material_level = CASE WHEN @level = '0' THEN material_level
                              ELSE @level END
    AND @acitem = CASE @column WHEN 'UnitUserField1' THEN unit_user_field_1
                               WHEN 'UnitUserField2' THEN unit_user_field_2
                               ELSE @acitem END
ORDER BY level_no

LukeH的回答将给出正确的行,但是当您尝试用单个查询替换查询生成机时,会丢失一些东西。该查询的某些部分对优化器来说是不透明的

如果您需要linq生成的原始查询,那么有两个选项

  • 生成每个可能的查询,并控制哪个查询由IF-ELSE运行
  • 使用动态sql来构造每个查询(尽管这会牺牲使用存储过程的许多好处)

如果您决定使用动态sql,您应该知道它的重要性。

谢谢David的建议-时间限制在召唤,所以我现在就作弊并使用Luke的答案!!!