我有一个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和/或
员工ID和/或
委员会类型ID
基于此,我希望能够在我的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)
答案 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;
}