2010-08-27 93 views
2

我想動態地爲LINQ to Entities建立一個LINQ查詢,這樣我就可以避免兩次重複相同的函數。我可以在LINQ to Entities中動態構建where子句嗎?

這裏是我想要做的事:

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)); 
} 

filter參數拋出此異常:

的LINQ表達式節點類型「調用」不支持LINQ到實體

我可能做到這一點:

protected IUser GetUserByNetworkId(string username) 
{ 
    return GetOrUpdateUser(
     from u in this.adapter.Users 
     where u.NetworkId == username 
     select u, 
     i => i.GetUserByNetworkId(username)); 
} 

protected IUser GetUserByEmail(string email) 
{ 
    return GetOrUpdateUser(
     from u in this.adapter.Users 
     where u.Email == email 
     select u, 
     i => i.GetUserByEmail(email)); 
} 

但是,那不是那麼幹淨。

有什麼建議嗎?

回答

1

您可以將二者結合起來LINQ語法

var query = from u in this.BuildQuery(this.adapter.Users, userName) 
      select u; 

希望這將指向你在正確的方向!

1

您可以這樣做,但您需要使用例如Expression<Func<...,而不僅僅是Func<...

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() 
} 

請注意,接口不會轉換爲L2E。所以你必須使用User,而不是IUser(或類似的)。當你調用它,然後

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

+1

然後我會在where子句中使用什麼語法? – 2010-08-27 14:56:07

+0

我添加了一個代碼示例。 – 2010-08-27 16:16:23

0

有兩個值得注意的項目。

  1. LINQ Expression Builder,和
  2. LinqPadLinQkit這是開源的。 PredicateBuilder類演示如何在Fly上構建Linq Query表達式。

這些引用可能會引導你。

爲了您的直接使用,我建議Predicatebuilder。