C# 如果字符串linq中存在id,则将值设置为true

C# 如果字符串linq中存在id,则将值设置为true,c#,linq,C#,Linq,我在表格中有以下字段: 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.

我在表格中有以下字段:

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)
}
);
然而,这是行不通的。
有任何帮助吗?

集合包含用户id,而不是包含集合的用户id。但是由于
String.Split
在Linq To Sql或Linq To Entities中不可用,您需要将
Linq To Object
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())
    };
但你真的应该解决这个烂摊子,因为太晚了。
这些用户属于通过外键链接的另一个表。

您的包含方式错误:

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

“键入varchar(50)并用逗号分隔用户ID”为什么会这样?这些用户属于通过外键链接的另一个表。请尝试交换表达式:
office.AllowedUsers.Contains(user.Id.ToString())
AllowedUsers
是一个
varchar
,需要使用Split(如果不使用Linq.-to对象,则无法使用该表达式)。考虑它是<代码> 9,10< /代码>,并检查它是否包含代码> 1 。它将返回true,因为
10
包含
1
@Tjaart:这是有效的。谢谢但是有一个小问题:由于用户id用逗号分隔,如果我连接了id为1的用户,并且在允许用户列表中,我有19、20、23。这会将布尔值设置为true,尽管AllowedUsers中不存在1。我怎样才能解决这个问题?@Rango:你明白我的意思了。你有解决这个问题的方法吗?我在@tabby更改了我的答案,尝试上面的方法。我尝试了你的解决方案,但我得到了一个错误:查询体必须以select子句或group子句结尾。