2013-10-04 62 views
1

我正在開發一個使用LinqToSQL的應用程序。作爲這個的一部分,我創建了一個整數列表,它們表示我想要篩選的鍵。在過去的每一次當我這樣做,並想加入我的列表和數據表我得到以下錯誤:LinqToSQL將本地列表連接到表 - 混淆

Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator

現在,這是很好的,因爲,我的理解是,這是一個limitaiton/LinqToSQl的功能。我一直在使用如圖所示,包含了我的查詢操作:

List<CargoProduct> cargoProducts = context.CargoProducts 
            .Where(cp => cargos.Contains(cp.CargoID)) 
            .ToList(); 

最近,我遇到了2100項限制在包含,所以一直在尋找其他的方法來做到這一點,最終想出以下:

List<CargoProduct> cargoProducts = context.CargoProducts.AsEnumerable() 
            .Join(cargos, cp => cp.CargoID, c => c, (cp, c) => cp) 
            .ToList(); 

現在,這工作得很好,所以我組建了一個知識共享電子郵件的情況下,他們跨越這個限制附帶的其他開發商。我試圖讓錯誤信息等擺放在一起的另一個查詢比我期望的失敗:

List<CargoProduct> results = (from c in cargos 
           join cp in context.CargoProducts on c equals cp.CargoID 
           select cp).ToList(); 

出乎我的意料,這不僅不會引發錯誤,但它返回完全相同的結果作爲先前的查詢。那麼,我在這裏錯過了什麼?我相信這是顯而易見的事情!

僅供參考上下文是我LinqToSQl連接和貨物被實例化:

List<int> cargos = context.Cargos.Select(c => c.CargoID).ToList(); 

更新

正如它確實似乎是在我參加的東西的順序答覆中提到,作爲如果我用了那麼下面我得到預期的錯誤消息:

List<CargoProduct> test3 = (from cp in context.CargoProducts 
      join c in cargos on cp.CargoID equals c 
      select cp).ToList(); 

有趣的功能,我想我明白爲什麼它是做什麼ð OES。可能是一個很好的解決方法,而不是使用包含較小數據集的包含。

+0

那麼,它允許你這樣做的原因是因爲你實際上並沒有傳入值,它查詢並返回整個表,然後從c#過濾它,而不是在SQL中過濾它。打開SQL分析器,看看它傳遞了什麼〜_〜) – Ricc

回答

1

在這個查詢

List<CargoProduct> results = (from c in cargos 
         join cp in context.CargoProducts on c equals cp.CargoID 
         select cp).ToList(); 

在聯接語句左操作數IEnumerable類型的,則該Enumerable.Join擴展方法被選擇在方法重載分辨率。這意味着整個CargoProducts表正被加載到內存中,並通過Linq To Objects進行過濾。它與context.CargoProducts.AsEnumerable()類似。