考虑一下这个功能:
public async Task<IEnumerable<Purchases>> GetPurchases(User user, Expression<Func<Purchases, bool>> whereClause)
{
using (var context = new UserDbContext())
{
context.Users.Attach(user);
context.Entry(user).Collection(p => p.Purchases)
.Query()
.Where(whereClause)
.Load();
if (Equals(user.Purchases, null))
return new List<Purchases>();
}
return user.Purchases;
}
在此函数中,参数 whereClause 有时可能为null
,我想要检查其是否为空,然后再分配一个空表达式(如果是)。这就像我来的那样接近:
if (Equals(whereClause, null))
whereClause = () => { };
这是基于here的问题,但对于使 whereClause 为空的行,我收到了错误。
错误7并非所有代码路径都返回type的lambda表达式中的值 &#39; System.Func&#39;&LT;&#39;采购,布尔&GT;&#39;
任何人都知道如何纠正这个问题?
答案 0 :(得分:4)
“并非所有代码路径都返回值”表示您的lambda没有返回任何内容。我的意思是,它只有一个代码路径,而且它不长。
Where
requires a lambda which takes one parameter, and returns bool
。 Where
不会让给它一个空的lambda表达式。
你需要给它一些可以用来过滤物品的东西。
这实际上很简单:
if (Equals(whereClause, null))
whereClause = o => true;
这是一个始终返回true
的where子句,无论你给它什么。这可能就是你想要的:如果没有过滤器,请包含所有内容。对于枚举中的每个项目,Where
一次一个地将lambda项目作为o
。如果lambda返回true
,则它在结果中包含o
的值。
如果您希望空过滤器不返回任何项,则只返回false:
if (Equals(whereClause, null))
// Whatever it is, I'm against it.
whereClause = o => false;
答案 1 :(得分:1)
whereClause
必须返回一个布尔值才能在LinQs Where
方法中使用它。
假设您不想过滤列表(包括所有项目),您必须返回true
,否则false
:
if (Equals(whereClause, null))
whereClause = () => true;
注意:如果您只返回带有单个语句的值,则不需要{
和}
。
但是你应该知道大多数框架方法都不能以这种方式工作。他们会抛出ArgumentNullException
而不是设置值。
答案 2 :(得分:1)
假设当whereClause
为空时您不想应用任何过滤器。
using (var context = new UserDbContext())
{
context.Users.Attach(user);
context.Entry(user).Collection(p => p.Purchases)
.Query()
.Where(whereClause ?? p => true)
.Load();
if (Equals(user.Purchases, null))
return new List<Purchases>();
}