返回整数列表并使用 .contains()
Returning a list of integers and using .contains()
我不熟悉 C#、ASP.NET、MVC、LINQ 以及我正在做的几乎所有其他事情。我们已经开发了一个事件调度系统的工作原型,它列出了所有站点的所有事件,而不考虑哪个站点正在调度什么事件。我们正在将原型调整为完整版本,现在希望调度程序仅查看他们安排的站点的事件。
我最初的尝试是填充一个包含调度程序可以调度的站点 ID 的整数列表,然后我将使用 .contains 来确定事件是否在登录用户的站点列表中。所以我有以下有效的查询(请注意,用户还不能 select 多个站点,这就是我使用 .FirstOrDefault() 的原因,因为我们有一些数据问题正在与客户合作解决。另请注意我在下面进一步包含了完整的方法):
int site = (from u in context.Employees
join hf in context.SiteHomeFacs on u.Default_Location_Code equals hf.HomeFac
where u.User_ID == usr
select hf.siteID).FirstOrDefault();
var sites = new List<int> {site};
return sites;
现在我想将一些角色默认设置为能够安排所有站点,这就是我开始遇到问题的地方(这里是完整方法):
public List<int> GetUserSites(string usr)
{
try
{
using (var context = new DBcontext())
{
if (HttpContext.Current.User.IsInRole("Owner") || HttpContext.Current.User.IsInRole("Controller"))
{
var everySite = (from s in context.Sites
select new List<int> { s.ID });
return everySite;
}
var site = (from u in context.Employees
join hf in context.SiteHomeFacs on u.Default_Location_Code equals hf.HomeFac
where u.User_ID == usr
select new List<int> { hf.siteID }).FirstOrDefault();
return sites;
}
}
catch (Exception)
{
throw;
}
}
'return everySite' 处的错误是:
Cannot implicitly convert type 'System.Linq.IQueryable>' to 'System.Collections.Generic.List'. An explicit conversion exists (are you missing a cast?)
对我来说,使用 .FirstOrDefault()
可以接受查询似乎违反直觉,但没有它就不行。有人可以帮我 return 一个整数值列表,这样我就可以使用 .contains 了吗?或者提出一个更好的方法?
为了解决这个问题,你可以这样做,
在末尾添加一个ToList()
以将IQueryable结果returned转换为IList,
var everySite = from s in context.Sites select s.ID ;
return everySite.ToList();
编辑:
为了支持大列表,您可以 return 一个哈希集,如下面的评论所述,
return new HashSet<int>(everySite);
我不熟悉 C#、ASP.NET、MVC、LINQ 以及我正在做的几乎所有其他事情。我们已经开发了一个事件调度系统的工作原型,它列出了所有站点的所有事件,而不考虑哪个站点正在调度什么事件。我们正在将原型调整为完整版本,现在希望调度程序仅查看他们安排的站点的事件。
我最初的尝试是填充一个包含调度程序可以调度的站点 ID 的整数列表,然后我将使用 .contains 来确定事件是否在登录用户的站点列表中。所以我有以下有效的查询(请注意,用户还不能 select 多个站点,这就是我使用 .FirstOrDefault() 的原因,因为我们有一些数据问题正在与客户合作解决。另请注意我在下面进一步包含了完整的方法):
int site = (from u in context.Employees
join hf in context.SiteHomeFacs on u.Default_Location_Code equals hf.HomeFac
where u.User_ID == usr
select hf.siteID).FirstOrDefault();
var sites = new List<int> {site};
return sites;
现在我想将一些角色默认设置为能够安排所有站点,这就是我开始遇到问题的地方(这里是完整方法):
public List<int> GetUserSites(string usr)
{
try
{
using (var context = new DBcontext())
{
if (HttpContext.Current.User.IsInRole("Owner") || HttpContext.Current.User.IsInRole("Controller"))
{
var everySite = (from s in context.Sites
select new List<int> { s.ID });
return everySite;
}
var site = (from u in context.Employees
join hf in context.SiteHomeFacs on u.Default_Location_Code equals hf.HomeFac
where u.User_ID == usr
select new List<int> { hf.siteID }).FirstOrDefault();
return sites;
}
}
catch (Exception)
{
throw;
}
}
'return everySite' 处的错误是:
Cannot implicitly convert type 'System.Linq.IQueryable>' to 'System.Collections.Generic.List'. An explicit conversion exists (are you missing a cast?)
对我来说,使用 .FirstOrDefault()
可以接受查询似乎违反直觉,但没有它就不行。有人可以帮我 return 一个整数值列表,这样我就可以使用 .contains 了吗?或者提出一个更好的方法?
为了解决这个问题,你可以这样做,
在末尾添加一个ToList()
以将IQueryable结果returned转换为IList,
var everySite = from s in context.Sites select s.ID ;
return everySite.ToList();
编辑: 为了支持大列表,您可以 return 一个哈希集,如下面的评论所述,
return new HashSet<int>(everySite);