实体框架多对多条件联接
本文关键字:条件 框架 实体 | 更新日期: 2023-09-27 18:36:55
现在我有 3 个表:用户、角色和多对多关联的User_Roles。我想创建一个搜索函数,该函数接收角色 ID 列表并返回具有该角色的用户。但是,如果角色 ID 列表为空,则应返回所有用户。
这就是我到目前为止所拥有的..
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;
}
但是我找不到一种方法仅在角色ID不为空时才有条件地加入User_Role。
我也试过这个,但没有用。
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();
是否可以在实体框架中进行条件联接?
分别处理每种情况。
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;
}
}
我最大的问题是在添加新搜索条件时保持代码可维护性并最大限度地减少数据库调用。我最终使用了 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();
}
}