创建一个公共谓词函数

mus*_*fan 28 c# linq-to-sql

首先,我不确定用什么术语来提出这个问题,这可能就是为什么我没有找到自己搜索的答案.

所以我正在使用Linq to SQL(C#,.Net 4),我希望得到一个符合条件的所有用户的列表,其基本内容我会做这样的事情:

var users = DataContext.Users.Where(x => x.Criteria1 == "something");
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我想要匹配一些字段,事情是这些特定的字段是一个常见的检查,我希望能够创建一个专用的功能,我可以在我的任何用户查询中使用它来检查这个比赛.

要尝试并解释说,好一点的可以举一个例子:比方说,用户有5面旗帜,我希望有一个共同的检查,看是否任何这些标志的设置.所以我可以这样写我的查询:

var users = DataContext.Users.Where(x => x.Flag1 || x.Flag2 || x.Flag3 || x.Flag4 || x.Flag5);
Run Code Online (Sandbox Code Playgroud)

但我想做的是分开"5旗检查",这样我也可以在其他查​​询中使用它,最终我想使用类似的东西:

var users = DataContext.Users.Where(x => x.Criteria1 == "something" && CheckForFlags(x));
Run Code Online (Sandbox Code Playgroud)

我通过这样的函数尝试了这个:

static bool CheckForFlags(User user)
{
   return user.Flag1 || user.Flag2 || user.Flag3 || user.Flag4 || user.Flag5;
}
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

"方法'布尔CheckForFlags(用户)'没有支持的SQL转换."

......这是有道理的,但是我能做些什么来让这项工作按我想要的方式进行?或者这是一个限制,因为我使用Linq to SQL,实际上是Linq to Objects可以使用的东西?

Ada*_*ras 47

关于LINQ to SQL如何处理表达式的巧妙之处在于,您实际上可以在代码中的其他位置构建表达式并在查询中引用它们.你为什么不尝试这样的事情:

public static class Predicates
{
    public static Expression<Func<User, bool>> CheckForFlags()
    {
        return (user => user.Flag1 || user.Flag2 || user.Flag3 ||
                        user.Flag4 || user.Flag5);
    }

    public static Expression<Func<User, bool>> CheckForCriteria(string value)
    {
        return (user => user.Criteria1 == value);
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦定义了谓词,就可以很容易地在查询中使用它们.

var users = DataContext.Users
    .Where(Predicates.CheckForFlags())
    .Where(Predicates.CheckForCriteria("something"));
Run Code Online (Sandbox Code Playgroud)