动态形成LINQ中的where子句

时间:2012-07-04 20:28:06

标签: linq sql-server-2008

我需要LINQ的帮助。这是我的情景。我有两个表用于存储员工详细信息,如姓名,ID,薪水,Primary_Emp和Year。用户可以从DDL中选择名称或ID,并将输入值传递给SP。 SQL Server将根据给定的输入返回数据。

tbl_Employee
EmpID   EmpName     Salary  Primary_Emp
1       xxx         10000   Yes
2       yyy         20000   Yes
3       zzz         30000   Yes

tbl_Year
EmpID   [Year]
1       2010
2       2011
3       2011

这是我的SQLQuery。我想在LINQ中应用相同的条件。 注意: - 用户有两个选项可以从DDL中选择EmpIDEmpName并在文本框中输入值(自由文本)

Input Parameters:
Name varchar(100)
EmpID varchar(100)

select distinct e.EmpID from 
tbl_employee e
inner join 
tbl_Year y
on e.EmpID = y.EmpID
where E.Primary_Emp = 'Yes'
**AND e.EmpName = (SELECT CASE WHEN @Key = 'Name' THEN @Value ELSE e.Empname END)
    AND e.EmpID = (SELECT CASE WHEN @Key = 'EmpID' THEN @Value ELSE e.EmpID END)**

问题:如何在linq中形成动态 where 子句。这里的问题是LHS也是动态的。如果用户传递EmpID,则不应考虑名称,反之亦然。

在linq中加入是强制性的!

1 个答案:

答案 0 :(得分:2)

如果您想要有条件地应用单独的过滤器表达式,则可以执行以下操作:

var query = from e in dbcontext.tbl_employee 
            join y in tbl_Year 
            on e.EmpID equals y.EmpID 
            where e.Primary_Emp = "Yes"
            select e;

if (key == "EmpName")
    query = from e in query where e.EmpName = value select e;
else if (key == "EmpID")
    query = from e in query where e.EmpID = value select e;

var result = (from e in query
              select e.EmpID).Distinct();

您可以通过这种方式有条件地继续堆叠 where 子句。