将LINQ中的条件where子句转换回SQL时遇到问题
我陷入了困境 我已经完成了一个时髦的LINQ语句,它在我的web应用程序中完成了这项工作,但现在我想在存储过程中使用它:将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
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的答案!!!