使用selectlistItem返回下拉列表框的不同数据

时间:2016-11-07 17:36:06

标签: asp.net-mvc-4 linq-to-sql linq-to-entities

我在数据库中有一个带有重复项的字段。我想在下拉列表中使用它 这必须返回不同的数据。

这是我为此创建的方法。

         public IEnumerable<SelectListItem> GetBranches(string username)
                {
                    using (var objData = new BranchEntities())
                    {
                        IEnumerable<SelectListItem> objdataresult = objData.ABC_USER.Select(c => new SelectListItem
                         {
                             Value = c.BRANCH_CODE.ToString(),
                             Text = c.BRANCH_CODE
                         }).Distinct(new Reuseablecomp.SelectListItemComparer());

                        return objdataresult;
                    }

                }

这是我正在使用的课程。

        public static class Reuseablecomp
            {
                public class SelectListItemComparer : IEqualityComparer<SelectListItem>
                {
                    public bool Equals(SelectListItem x, SelectListItem y)
                    {
                        return x.Text == y.Text && x.Value == y.Value;
                    }

                    public int GetHashCode(SelectListItem item)
                    {
                        int hashText = item.Text == null ? 0 : item.Text.GetHashCode();
                        int hashValue = item.Value == null ? 0 : item.Value.GetHashCode();
                        return hashText ^ hashValue;
                    }
                }
            }

没有返回任何内容。我收到了以下错误。当我尝试没有明确的基本查询时, 一切正常。

        {"The operation cannot be completed because the DbContext has been disposed."}  
        System.Exception {System.InvalidOperationException}

内部异常= null

问题:如何为我的下拉列表返回不同的数据?

1 个答案:

答案 0 :(得分:1)

从技术上讲,只需在.ToList()电话后附加Distinct(...)即可解决您的问题。问题是查询被评估为JIT(及时)。换句话说,在需要查询表示的实际数据之前,查询实际上不会发送到数据库。调用ToList就是这样一种需要实际数据的东西,因此会立即评估查询。

但是,问题的根本原因是您在using语句中执行此操作。方法退出时,尚未评估查询,但您现在已经处理了上下文。因此,当需要实际评估该查询时,没有上下文可以执行此操作并且您获得该异常。你应该永远使用与using结合的数据库上下文。它只是灾难的一种方法。理想情况下,您的上下文应该是请求范围的,您应该使用依赖注入将其提供给需要它的任何对象或方法。

此外,对于它的价值,您只需将Distinct来电转移到Select之前,您就不再需要自定义IEqualityComparer了。例如:

var objdataresult = objData.ABC_USER.Distinct().Select(c => new SelectListItem
{
    Value = c.BRANCH_CODE.ToString(),
    Text = c.BRANCH_CODE
});

操作顺序在这里很重要。调用Distinct首先将其作为对数据库的查询的一部分包括在内,但在您进行之后调用它,一旦进行了评估,就会在内存中集合中运行它。然后,后者需要自定义逻辑来确定IEnumerable<SelectListItem>中构成不同项的内容,这显然不是数据库查询版本所必需的。