Linq to sql 将筛选函数传递到LINQ to SQL中的Where()

Linq to sql 将筛选函数传递到LINQ to SQL中的Where(),linq-to-sql,Linq To Sql,我正在尝试编写一组过滤函数,这些函数可以链接在一起,以逐步过滤数据集。这其中的棘手之处在于,我希望能够在不同的上下文中定义过滤器,而不是使用它们。我已经能够在LINQ语句中向Where()子句传递一个非常基本的函数: 筛选文件: Func<item, bool> returnTrue = (i) => true; Func<item, bool> isAssignedToUser = (i) => i.assignedUserId == userId; F

我正在尝试编写一组过滤函数,这些函数可以链接在一起,以逐步过滤数据集。这其中的棘手之处在于,我希望能够在不同的上下文中定义过滤器,而不是使用它们。我已经能够在LINQ语句中向Where()子句传递一个非常基本的函数:

筛选文件:

Func<item, bool> returnTrue = (i) => true;
Func<item, bool> isAssignedToUser = (i) => i.assignedUserId == userId;
Func returnTrue=(i)=>true;
存储库文件:

public IQueryable<item> getItems()
{
    return DataContext.Items.Where(returnTrue);
}
public IQueryable<item> getItemsAssignedToUser(int userId)
{
    return DataContext.Items.Where(isAssignedToUser);
}
public IQueryable getItems()
{
返回DataContext.Items.Where(returnTrue);
}
这很有效。然而,当我尝试使用更复杂的逻辑时,问题就开始了:

筛选文件:

Func<item, bool> returnTrue = (i) => true;
Func<item, bool> isAssignedToUser = (i) => i.assignedUserId == userId;
Func isAssignedToUser=(i)=>i.assignedUserId==userId;
存储库文件:

public IQueryable<item> getItems()
{
    return DataContext.Items.Where(returnTrue);
}
public IQueryable<item> getItemsAssignedToUser(int userId)
{
    return DataContext.Items.Where(isAssignedToUser);
}
public IQueryable getItemsAssignedToUser(int userId)
{
返回DataContext.Items.Where(isAssignedToUser);
}
这甚至不会生成,因为userId与isAssignedToUser()不在同一范围内。我还尝试声明了一个将userId作为参数的函数:

Func<item, int, bool> isAssignedToUser = (i, userId) => i.assignedUserId == userId;
Func isAssignedToUser=(i,userId)=>i.assignedUserId==userId;
问题是它不符合Where()所期望的函数签名:

Func<item, bool>
Func
一定有办法做到这一点,但我不知道怎么做。我觉得我没有很好地解释这一点,但希望你能理解要点

谢谢

Daniel

如果在Where子句中使用内联匿名函数,感谢用户ID已经在范围内。这意味着,当你在一个方法中有一个匿名函数时,该方法中的变量对匿名函数是可用的,即使它们看起来是“外部的”

public IQueryable getItemsAssignedToUser(int userId)
{
返回DataContext.Items.Where(i=>i.assignedUserId==userId);
}
您还可以在getItemsAssignedToUser方法内创建Func isAssignedToUser并将其传递给Where子句,如下所示,但这是不必要的:

public IQueryable<item> getItemsAssignedToUser(int userId)
{
    Func<item, bool> isAssignedToUser = (i) => 
    {
        return i.assignedUserId == userId; 
    };

    return DataContext.Items.Where(isAssignedToUser);
}
public IQueryable getItemsAssignedToUser(int userId)
{
Func isAssignedToUser=(i)=>
{
返回i.assignedUserId==userId;
};
返回DataContext.Items.Where(isAssignedToUser);
}

您不需要将函数声明为纯独立函数。您可以使用内嵌lambda:

public IQueryable<item> getItemsAssignedToUser(int userId)
{
    return DataContext.Items.Where(i => i.assignedUserId == userId);
}
public IQueryable getItemsAssignedToUser(int userId)
{
返回DataContext.Items.Where(i=>i.assignedUserId==userId);
}
lambdas的官方文档是,但是你可能会发现在谷歌上搜索结果更容易阅读