我在表格中有以下字段:
AllowedUsers:类型为varchar(50),用户ID用逗号分隔。
我必须根据此允许用户的“列表”中是否存在我的应用程序的连接用户ID来设置布尔值。 有什么想法吗?
我的查询如下:
(from user in db.FindAll(usr => usr.Email.Equals(userLogin.Username) &&
usr.Password.Equals(userLogin.Password))
join office in db.FindAll() on user.OfficeId equals office.Id
select new UserDetails()
{
UserID = user.Id,
Language = user.Language,
OfficeId = user.OfficeId,
IsAllowed = user.Id.ToString().Contains(office.AllowedUsers)
}
);
但是这不起作用。 有帮助吗?
答案 0 :(得分:1)
集合包含用户ID,而不是用户ID包含集合。但是由于String.Split
在Linq-To-Sql或Linq-To-Entities中不可用,因此您需要将Linq-To-Objects
与AsEnumerable
一起使用。请注意,您应该先过滤,因为AsEnumerable
之后的所有内容都将流式传输到内存中。
var loginUser =
from user in db.FindAll(usr => usr.Email.Equals(userLogin.Username) && usr.Password.Equals(userLogin.Password))
join office in db.FindAll() on user.OfficeId equals office.Id
select new { user, office };
var userDetails = from u in loginUser.AsEnumerable()
select new UserDetails()
{
UserID = u.user.Id,
Language = u.user.Language,
OfficeId = u.user.OfficeId,
IsAllowed = u.office.AllowedUsers.Split(',').Contains(u.user.Id.ToString())
};
但是您应该真正解决此问题,因为为时已晚。 这些用户属于另一个通过外键链接的表。
答案 1 :(得分:1)
您的包含是错误的方法:
var result = (from user in db.FindAll(usr => usr.Email.Equals(userLogin.Username) &&
usr.Password.Equals(userLogin.Password))
join office in db.FindAll() on user.OfficeId equals office.Id
select new
{
UserID = user.Id,
Language = user.Language,
OfficeId = user.OfficeId,
IsAllowed = false,
AllowedUsers = office.AllowedUsers
}
).ToList();
var final = result.Select(c=> new UserDetails {
UserID = c.Id,
Language = c.Language,
OfficeId = c.OfficeId,
IsAllowed = c.AllowedUsers.Split(",").Contains(user.Id.ToString())
});