我有与ItemsLines表链接的Items和Lines。
在网页上,我显示了一个项目。我想在DropDownList中显示所有未链接到此Item的行。
这不起作用:
int ItemId = Convert.ToInt32(Request.QueryString["id"]);
ddlLines.DataSource = context.Lines.Where(t => !t.ItemLines.Any(x => x.ItemId == ItemId));
我试图将线条放在哪里(它们与物品无关)。
我无法弄清楚如何做到这一点。
非常感谢!
编辑:
这是我收到的错误消息:
objectcontext实例已被处理,无法再使用
答案 0 :(得分:1)
您的错误不是因为您的lambda表达式不正确。您的问题是在调用之前已经处理了用于连接数据库的上下文对象:
ddlLines.DataSource = context.Lines.Where(t => !t.ItemLines.Any(x => x.ItemId == ItemId));
解决方案是在表达式的末尾添加.ToList()。这是因为.Where lambda表达式从IQueryable接口返回一些内容,并且该接口的所有内容仍然与数据库有连接。因此,通过添加.ToList(),它将删除与数据库的连接。
答案 1 :(得分:0)
首先,错误消息是因为已经处理了上下文(我假设您在'using'块中使用它,这意味着在实际数据绑定发生时已经处理了上下文)。如果您打算直接绑定到项目,您可能希望使用projection,这将创建一个未连接到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而不是lambda。它将返回IEnumerable中所有不在你提供的集合中的东西,并且它有点清洁:
ddlLines.DataSource = context.Lines.Except(new int[] { ItemId }).Select(...).ToList();