我是C#,ASP.NET,MVC,LINQ以及我正在做的其他一切的新手。我们开发了一个事件调度系统的工作原型,该系统列出了所有站点的所有事件,而不考虑哪个站点正在安排什么事件。我们正在将原型调整为完整版本,现在希望调度程序只能查看他们安排的站点的事件。
我最初的尝试是填充一个整数列表,其中包含调度程序可以安排的站点的ID,然后我将使用.contains来确定事件是否在登录用户的站点列表中。所以我有以下查询可行(注意用户还不能选择多个站点,这就是我使用.FirstOrDefault()的原因,因为我们有一些数据问题,我们正在与客户合作解决。另请注意我和#39;包括下面的完整方法):
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;
}
}
错误在&#39;返回everySite&#39;是:
无法隐式转换类型System.Linq.IQueryable&gt;&#39;到&#39; System.Collections.Generic.List&#39;。存在显式转换(您是否错过了演员?)
对我而言,.FirstOrDefault()
可以接受该查询似乎是违反直觉的,但不是没有它。有人可以帮我返回一个整数值列表,这样我就可以使用.contains了吗?或建议一个更好的方式吗?
答案 0 :(得分:0)
为了解决这个问题,你可以这样做,
在末尾添加ToList()
以将返回的IQueryable结果转换为IList,
var everySite = from s in context.Sites select s.ID ;
return everySite.ToList();
修改强> 为了支持大型列表,您可以返回下面评论中提到的HashSet,
return new HashSet<int>(everySite);