非常感谢leppie: 目前我得到了
Expression<Func<vwMailMerge,bool>> whereClause= null;
List<vwMailMerge> mailMergeItems = null;
int personType = mailMergeSettings.PersonType.ToInteger();
if (personType > 0)
{
whereClause = this.MailMergeWhereClause(whereClause, f => f.MemberTypeId == personType);
}
if (mailMergeSettings.PersonIds != null)
{
var personIds = mailMergeSettings.PersonIds.ToGuidArray();
if (personIds != null && personIds.Length > 0)
{
var personList = personIds.ToList();
whereClause = this.MailMergeWhereClause(whereClause, f => personList.Contains(f.UserId));
}
}
mailMergeItems = this.ObjectContext.vwMailMerges.Where(whereClause).ToList();
private Expression<Func<vwMailMerge, bool>> MailMergeWhereClause(params Expression<Func<vwMailMerge, bool>>[] wheres)
{
if (wheres.Length == 0)
{
return x => true;
}
Expression result;
if (wheres[0] == null)
{
result = wheres[1].Body;
return Expression.Lambda<Func<vwMailMerge, bool>>(result, wheres[1].Parameters);
}
else
{
result = wheres[0].Body;
for (int i = 1; i < wheres.Length; i++)
{
result = Expression.And(result, wheres[i].Body);
}
return Expression.Lambda<Func<vwMailMerge, bool>>(result, wheres[0].Parameters);
}
}
}
当它到达“mailMergeItems =”时,它会丢弃并给出错误:“参数'f'未绑定在指定的LINQ to Entities查询表达式中。”
我注意到,当仅检查人员或仅检查membertypeId时,它正常工作..但是第二次合并会给出错误“f =&gt;”我想。
答案 0 :(得分:2)
您无法使用Func
,您需要使用Expression<Func>
。
+
可以通过Expression.And
完成。
更新(未经测试):
Expression<Func<vwMailMerge, bool>> whereClause = null;
...
Expression<Func<vwMailMerge, bool>> MailMergeWhereClause(
params Expression<Func<vwMailMerge, bool>>[] wheres)
{
if (wheres.Length == 0) return x => true;
Expression result = wheres[0].Body;
for (int i = 1; i < wheres.Length; i++)
{
//probaby needs a parameter fixup, exercise for reader
result = Expression.And(result, wheres[i].Body);
}
return Expression.Lambda<Func<vwMailMerge,bool>>(result, wheres[0].Parameters);
}
更新2:
上述方法如我所料那样失败。使用ExpressionVistor
类在.NET 4上解决可能很容易。对于.NET 3.5(或者前面提到的太难了),以下内容应该可行。
方法是直接附加IQueryable
中的where子句,以便最终得到:
somequery.Where(x => x.foo).Where(x => x.bar).Where(x => x.baz)
IOW,你可以根据需要添加它们,但是它需要对你粘贴的代码的逻辑/流程进行一些更改。
答案 1 :(得分:0)
您可以使用代码工具更好地重新格式化您的问题。
然而,看起来您可以通过这种方式解决问题,以避免所有那些func表达式浮动:
this.ObjectContext.vwMailMerges.Where(mm=>IsValidMailMerge(mm,personType)).ToList()
private bool IsValidMailMerge(YourType mailmerge, YourType2 personType)
{
if(...) // type specific criteria here
return true;
else
return false;
}