【问题标题】:Returning a list of integers and using .contains()返回整数列表并使用 .contains()
【发布时间】:2017-01-14 06:32:00
【问题描述】:

我是 C#、ASP.NET、MVC、LINQ 以及我正在做的几乎所有其他事情的新手。我们开发了一个事件调度系统的工作原型,它列出了所有站点的所有事件,而不考虑哪个站点正在调度什么事件。我们正在将原型调整为完整版本,现在希望调度程序仅查看他们调度的站点的事件。

我最初的尝试是填充一个整数列表,其中包含调度程序可以调度的站点的 ID,然后我将使用 .contains 来确定事件是否在登录用户的站点列表中。所以我有以下有效的查询(请注意,用户还不能选择多个站点,这就是我使用 .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' 的错误是:

无法将类型“System.Linq.IQueryable>”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)

对我来说,使用.FirstOrDefault() 可以接受查询似乎违反直觉,但没有它就不行。有人可以帮我返回一个整数值列表,以便我可以使用 .contains 吗?还是建议一个更好的方法?

【问题讨论】:

    标签: c# asp.net-mvc linq entity-framework-4


    【解决方案1】:

    为了解决这个问题,你可以这样做,

    在末尾添加ToList(),将返回的IQueryable结果转换为IList,

     var everySite = from s in context.Sites select s.ID ;    
     return everySite.ToList();
    

    编辑: 为了支持大列表,您可以返回下面评论中提到的 HashSet,

    return new HashSet<int>(everySite);
    

    【讨论】:

    • 如果您的列表很长并且需要进行大量检查,我会使用 HashSet 而不是 List - 查找的性能要好得多。 return new HashSet(everySite);
    • 值得一提的是select new List&lt;int&gt; { s.ID }应该是select s.ID
    • ToList 有效,但只有在我删除了新的 List {s.ID} 之后——这是有道理的。还要感谢有关使用 HashSet 的说明。到目前为止,站点列表很小。无论如何都会努力使用它。
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2012-01-07
    • 2017-12-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多