动态连接基于where表达式 - linq / c#

时间:2009-08-17 16:28:22

标签: c# linq

我有一个sp,它根据我的输入参数构建动态sql查询。我尝试在linq中复制,但似乎不正确。

我的linq:

  var result = from R in db.Committees.Where(committeeWhere)
           join C in db.Employees.Where(employeeWhere) on R.PID equals C.PID
           join K in db.CommitteeTypes.Where(committeesWhere) on R.PID equals K.PID
           select new { R };

我输入的3个参数是: 1.委员会ID和/或

  1. 员工ID和/或

  2. 委员会类型ID

  3. 基于此,我希望能够在我的linq中进行连接。

    注意:我必须更改表名和列名,所以请不要考虑名称。

    Sql代码段:

    IF @committeeID is not null
    

    设置@wherestr = @wherestr +'Committees.committeeID喜欢'+ @committeeID + @andstr

    // ...

    IF  len(@wherestr) > 6      
    
    
      SELECT  @qrystr = @selectstr + @fromstr + left(@wherestr, len(@wherestr)-3) + ' ORDER BY Committees.committeeID DESC 
    
    EXEC (@qrystr)
    

2 个答案:

答案 0 :(得分:1)

为什么需要使用动态SQL?这不行吗?

IQueryable<Committee> GetCommittees(int? committeeID, int? employeeID, int? committeeTypeID)
{
    var result = from R in db.Committees.Where(c => committeeID == null || committeeID == c.ID)
                 join C in db.Employees.Where(e => employeedID == null || employeeID == e.ID)
                   on R.PID equals C.PID
                 join K in db.CommitteeTypes.Where(c => committeeTypeID == null || committeeTypeID == c.ID)
                   on R.PID equals K.PID
                 select R;
}

如果这不起作用,您可以根据参数使用不同的谓词表达式:

Expression<Func<Committee, bool>> committeeWhere;
if(committeeID.HasValue)
{
    int id = committeeID.Value;
    committeeWhere = c => c.ID == id;
}
else
{
    committeeWhere = c => true;
}
// etc

更新:看到您的上一条评论,也许您想要这样的内容:

IQueryable<Committee> GetCommittees(int? committeeID, int? employeeID, int? committeeTypeID)
{
    var result = db.Committees.Select(c => c);

    if(committeeID.HasValue)
    {
        result = result.Where(c => c.ID = committeeID);
    }
    else if(employeeID.HasValue)
    {
        result = from R in result
                 join C in db.Employees.Where(e => employeeID == e.ID)
                   on R.PID equals C.PID
                 select R;
    }
    else if(committeeTypeID.HasValue)
    {
        result = from R in result
                 join K in db.CommitteeTypes.Where(ct => committeeTypeID == ct.ID)
                   on R.PID equals K.PID
                 select R;
    }

    return result;
}

答案 1 :(得分:0)

如果我可以改进dahlbyk的答案......有时加入会引入重复。如果你真的打算过滤 - 然后过滤。此外 - 如果您在LinqToSql设计器中添加关系,您将拥有将为您翻译的属性(例如Commission.Employees)。

IQueryable<Committee> GetCommittees(int? committeeID, int? employeeID, int? committeeTypeID){
    IQueryable<Committee> result = db.Committees.AsQueryable();
    if(committeeID.HasValue)
    {
        result = result.Where(c => c.ID = committeeID);
    }
    if(employeeID.HasValue)
    {
        result = result
            .Where(committee => committee.Employees
                .Any(e => employeeID == e.ID)
            );
    }
    if(committeeTypeID.HasValue)
    {
        result = result
            .Where(committee => committee.CommitteeTypes
                .Any(ct => committeeTypeID == ct.ID)
            );
    }
    return result;
}