2012-03-07 51 views
0

我有與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的實例已設置,不能再使用

回答

1

你的錯誤是不是因爲你的lambda表達式是不正確。你的問題是,你正在使用連接到您的數據庫上下文對象已被釋放在打電話前的:

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

的解決方案是一個.ToList()添加到您的表達式的末尾。這是因爲.Where表達式返回IQueryable接口中的某些內容,並且該接口中的所有內容仍與數據庫有連接。所以通過添加.ToList()它將刪除到數據庫的連接。

+0

謝謝!我添加.ToList(),現在它工作正常! – JoRouss 2012-03-07 15:42:05

+0

用linq實體,你會如何選擇不同的行? – JoRouss 2012-03-07 15:46:12

+0

瞭解它:(從t的context.ItemLines 其中t.ItemId!= ItemId select t.Line).Distinct() – JoRouss 2012-03-07 15:48:34

0

首先,錯誤信息是因爲上下文已經處理(我假設你正在'using'塊內使用它,這意味着上下文已經在實際的數據綁定發生時被處理)。如果你打算直接綁定的物品,你可能需要使用投影,這將創建一個未連接到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. 

其次,你可能要考慮使用除了這個,而不是你的拉姆達。它會在你提供的設置爲不返回IEnumerable的所有事情,這是一個有點清潔:

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