C# 我可以在LINQtoEntities中动态构建where子句吗?
我正在尝试为LINQ to实体动态构建一个LINQ查询,这样可以避免重复相同的函数两次 以下是我想做的: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)
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;