Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在LINQtoEntities中动态构建where子句吗?_C#_.net_Linq To Entities - Fatal编程技术网

C# 我可以在LINQtoEntities中动态构建where子句吗?

C# 我可以在LINQtoEntities中动态构建where子句吗?,c#,.net,linq-to-entities,C#,.net,Linq To Entities,我正在尝试为LINQ to实体动态构建一个LINQ查询,这样可以避免重复相同的函数两次 以下是我想做的: private IUser GetOrUpdateUser(Predicate<IUser> filter, Func<IIdentityProvider, UserRecord> fetch) { var user = (from u in this.adapter.Users where filter(u)

我正在尝试为LINQ to实体动态构建一个LINQ查询,这样可以避免重复相同的函数两次

以下是我想做的:

private IUser GetOrUpdateUser(Predicate<IUser> filter, Func<IIdentityProvider, UserRecord> fetch)
{
    var user = (from u in this.adapter.Users
                where filter(u)
                select u).SingleOrDefault();

    if (user == null)
    {
        // User not found.  Add him.
        user = this.adapter.AddUser(fetch(this.idenityProvider));
    }
    else if (user.IsExpired)
    {
        // User found, but expired.  Update him.
        this.adapter.UpdateUser(user, fetch(this.idenityProvider));
    }

    return user;
}

protected IUser GetUserByNetworkId(string username)
{
    return GetOrUpdateUser(
        u => u.NetworkId == username,
        i => i.GetUserByNetworkId(username));
}

protected IUser GetUserByEmail(string email)
{
    return GetOrUpdateUser(
        u => u.Email == email,
        i => i.GetUserByEmail(email));
}
但是,这并不那么干净


有什么建议吗?

您可以这样做,但您需要使用,例如,
表达式您可以将两个LINQ语法组合起来:

private IQueryable<IUser> BuildQuery(IQueryable<IUser> users, string userName)
{
    users = users.Where(u => u.UserName == userName);
    return users;
}

希望这将为你指明正确的方向

这方面有两个值得注意的项目

  • ,及
  • 它是开源的。PredicateBuilder类演示如何动态构建Linq查询表达式
  • 这些参考资料可能会指导您


    为了便于您立即使用,我建议使用Predicatebuilder。

    然后在
    where
    子句中使用什么语法?
    Expression<Func<User, Bool>> MakePredicate(int id)
    {
        return u => u.Id == id;
    }
    
    void DoStuff()
    {
        Expression<Func<User, Bool>> pred = MakePredicate(123);
        User u = Context.Users.Where(pred).Single()
    }
    
    private IQueryable<IUser> BuildQuery(IQueryable<IUser> users, string userName)
    {
        users = users.Where(u => u.UserName == userName);
        return users;
    }
    
    var query = from u in this.BuildQuery(this.adapter.Users, userName)
                select u;