C# 创建空lambda表达式

C# 创建空lambda表达式,c#,.net,lambda,C#,.net,Lambda,考虑以下功能: public async Task<IEnumerable<Purchases>> GetPurchases(User user, Expression<Func<Purchases, bool>> whereClause) { using (var context = new UserDbContext()) { cont

考虑以下功能:

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;
}
这是基于问题,但对于使where子句为空的行,我得到了错误

错误7并非所有代码路径都在lambda表达式中返回类型为的值 “System.Func”“并非所有代码路径都返回值”表示lambda没有返回任何内容。我的意思是,它只有一条代码路径,而且不长

<代码>其中不允许为其指定空lambda表达式

你需要给它一些东西,它可以用来过滤项目

这其实很简单:

if (Equals(whereClause, null))
    whereClause = o => true;
这是一个where子句,它总是返回
true
,而不管您给它什么。这可能就是你想要的:如果没有过滤器,包括所有内容。对于枚举中的每个项目,一次一个,
其中
将该项目作为
o
提供给lambda。如果lambda返回
true
,则在结果中包含
o
的值

如果希望null筛选器不返回任何项目,只需返回false即可:

if (Equals(whereClause, null))
    //  Whatever it is, I'm against it.
    whereClause = o => false;
“并非所有代码路径都返回值”表示lambda没有返回任何内容。我的意思是,它只有一条代码路径,而且不长

<代码>其中不允许为其指定空lambda表达式

你需要给它一些东西,它可以用来过滤项目

这其实很简单:

if (Equals(whereClause, null))
    whereClause = o => true;
这是一个where子句,它总是返回
true
,而不管您给它什么。这可能就是你想要的:如果没有过滤器,包括所有内容。对于枚举中的每个项目,一次一个,
其中
将该项目作为
o
提供给lambda。如果lambda返回
true
,则在结果中包含
o
的值

如果希望null筛选器不返回任何项目,只需返回false即可:

if (Equals(whereClause, null))
    //  Whatever it is, I'm against it.
    whereClause = o => false;

whereClause
必须返回一个布尔值才能在LinQs方法中使用它

假设您不想筛选列表(包括所有项目),则必须返回
true
,否则
false

if (Equals(whereClause, null))
     whereClause = () => true; 
注意:
{
}
如果只返回一条语句中的值,则不需要


但是您应该知道,大多数框架方法都不是这样工作的。它们将抛出一个而不是设置一个值。

whereClause
必须返回一个布尔值才能在LinQs方法中使用它

假设您不想筛选列表(包括所有项目),则必须返回
true
,否则
false

if (Equals(whereClause, null))
     whereClause = () => true; 
注意:
{
}
如果只返回一条语句中的值,则不需要


但是您应该知道,大多数框架方法都不是这样工作的。它们将抛出一个而不是设置一个值。

假设当
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>();
        }
使用(var context=new UserDbContext())
{
context.Users.Attach(用户);
context.Entry(user.Collection)(p=>p.Purchases)
.Query()
.Where(Where子句??p=>true)
.Load();
if(等于(user.Purchases,null))
返回新列表();
}

假设当
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>();
        }
使用(var context=new UserDbContext())
{
context.Users.Attach(用户);
context.Entry(user.Collection)(p=>p.Purchases)
.Query()
.Where(Where子句??p=>true)
.Load();
if(等于(user.Purchases,null))
返回新列表();
}