2012-06-12 33 views
2

現在我有3個表:User,Roles和User_Roles用於多對多關聯。我想創建一個搜索函數,它接收一個RoleID列表並返回具有該角色的用戶。但是如果RoleID列表爲空,則應返回所有用戶實體框架多對多條件連接

這是我迄今爲止..

public static List<User> SearchUser(List<int> roleIDs) 
{ 
    List<User> userList = new List<User>(); 
    using (var db = new DBContext()) 
    { 
     var users = (
      from u in db.Users 
      join ur in db.User_Role 
       on u.UserID equals ur.UserID 
      join r in roleIDs 
       on ur.RoleID equals r 
      select u 
      ).Distinct().ToList(); 
    } 
    return userList; 
} 

,但我不能想出一個辦法來有條件地加入到USER_ROLE只有當roleIDs不爲空。

我也試過這個,但它沒有工作。

var users = (from u in db.Users 
      from r in roleIDs 
      join ur in db.User_Role 
       on u.UserID equals ur.UserID 
      where roleIDs.Count == 0 || ur.RoleID == r 
      select u 
       ).Distinct().ToList(); 

是否有可能在實體框架中有條件連接?

回答

1

分別處理每個案例。

public static List<User> SearchUser(List<int> roleIDs) 
{ 
    using (var db = new DBContext()) 
    { 
     if (roleIDs.Count == 0) 
     { 
      return db.Users.ToList(); 
     } 

     var users = (
      from u in db.Users 
      join ur in db.User_Role 
       on u.UserID equals ur.UserID 
      join r in roleIDs 
       on ur.RoleID equals r 
      select u 
      ).Distinct().ToList(); 

     return users; 
    } 
} 

如果連接表沒有映射爲單獨的實體,那麼可以按如下簡化連接。

public static List<User> SearchUser(List<int> roleIDs) 
{ 
    using (var db = new DBContext()) 
    { 
     if (roleIDs.Count == 0) 
     { 
      return db.Users.ToList(); 
     } 

     var users = db.Users.Where(u => u.Roles.Any(r => roleIDsContains(r.Id))) 
      .Distinct().ToList(); 

     return users; 
    } 
} 
+0

謝謝Eranga。如果使用if語句,但實際上,該函數將能夠採用多個列表參數來進一步過濾搜索。使用空列表和非空列表的所有組合,使用if語句將快速變得雜亂無章。這就是爲什麼我認爲有條件的連接將是最優雅的方式。 – nthpixel

+1

我從技術上說明了你的回答是答案,因爲如果陳述是順其自然的話。我只是改變了邏輯。看到我發佈的回覆。 – nthpixel

0

我最大的擔心是,隨着新的搜索標準的添加,保持代碼的可維護性,並儘量減少數據庫調用。我結束了使用if語句,但直到最後才從數據庫加載它。這導致發送一個大的查詢。我通過在最後調用.ToList()強制數據庫調用。

public static List<user> SearchUser(List<int> roleIDs, List<int> hobbyIDs) 
{ 
    List<User> Users = new List<User>(); 
    IQueryable<User> tempUsers = null; 
    using (var db = new DBContent()) 
    { 
     tempUsers = db.Users; 

     if (roleIDs.Count > 0) 
     { 
      tempUsers = from u in tempUsers 
         join ur in db.User_Role on u.UserID equals ur.UserID 
         join r in roleIDs on ur.RoleID equals r 
         select u; 
     } 

     if (hobbyIDs.Count > 0) 
     { 
      tempUsers = from u in tempUsers 
         join uh in db.User_Hobby on u.UserID equals uh.UserID 
         join h in hobbyIDs on uh.HobbyID equals h 
         select u; 
     } 

     //Go get it from the database 
     Users = ((ObjectQuery<User>)tempUsers) 
      .Include("Address").Distinct().ToList(); 
    } 
}