【问题标题】:Get entities that are not linked获取未链接的实体
【发布时间】:2012-03-07 23:57:25
【问题描述】:

我有与 ItemsLines 表链接的项目和行。

在网页上,我显示一个项目。我想在 DropDownList 中显示所有未链接到此项目的行。

这不起作用:

int ItemId = Convert.ToInt32(Request.QueryString["id"]);

ddlLines.DataSource = context.Lines.Where(t => !t.ItemLines.Any(x => x.ItemId == ItemId));

我试图获取 Lines where(它们与 Item 无关)。

我不知道该怎么做。

非常感谢!

编辑:

这是我收到的错误消息:

objectcontext 实例已被释放,不能再使用

【问题讨论】:

    标签: c# asp.net entity-framework


    【解决方案1】:

    您的错误不是因为您的 lambda 表达式不正确。你的问题是你用来连接数据库的上下文对象在你调用之前已经被处理掉了:

    ddlLines.DataSource = context.Lines.Where(t => !t.ItemLines.Any(x => x.ItemId == ItemId));
    

    解决方案是将 .ToList() 添加到表达式的末尾。这是因为 .Where lambda 表达式从 IQueryable 接口返回一些内容,并且该接口中的所有内容仍然与数据库有连接。因此,通过添加 .ToList() 它将删除与数据库的连接。

    【讨论】:

    • 使用 linq to entity,你将如何选择不同的行?
    • 知道了:(从 t in context.ItemLines where t.ItemId != ItemId select t.Line).Distinct()
    • @JoRouss 感谢您提供的附加信息,我没有考虑 .Distinct()。很高兴我能帮上忙!
    • 您的表达式将不起作用,因为我只想要与此项目无关的行。如果我有另一个项目链接到未链接到此项目的行,您的表达式将返回它。
    【解决方案2】:

    首先,错误消息是因为上下文已被释放(我假设您在“使用”块中使用它,这意味着在实际数据绑定发生时上下文已被释放)。如果您打算直接绑定到项目,您可能需要使用投影,这将创建一个未连接到 DataContext 的新实例:

    ddlLines.DataSource = context.Lines.Where(
      t => !t.ItemLines.Any(x => x.ItemId == ItemId)
    ).Select(
    t => new 
    {
        SomeProperty = t.SomeProperty, 
        SomeOtherProperty = t.SomeOtherProperty }).ToList();
    // Where SomeProperty and SomeOtherProperty are the display/value fields, etc.
    

    其次,您可能需要考虑使用 except for this 而不是您的 lambda。它会返回一个 IEnumerable,其中包含您提供的集合之外的所有东西,而且它更简洁:

    ddlLines.DataSource = context.Lines.Except(new int[] { ItemId }).Select(...).ToList(); 
    

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多