创建空的lambda表达式

时间:2016-08-11 19:48:44

标签: c# .net lambda

考虑一下这个功能:

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;

任何人都知道如何纠正这个问题?

3 个答案:

答案 0 :(得分:4)

“并非所有代码路径都返回值”表示您的lambda没有返回任何内容。我的意思是,它只有一个代码路径,而且它不长。

Where requires a lambda which takes one parameter, and returns boolWhere不会给它一个空的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>();
        }
相关问题