我在数据库中有一个带有重复项的字段。我想在下拉列表中使用它 这必须返回不同的数据。
这是我为此创建的方法。
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
问题:如何为我的下拉列表返回不同的数据?
答案 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>
中构成不同项的内容,这显然不是数据库查询版本所必需的。