2017-09-27 84 views
0

希望標題足夠清楚。 我的倉庫方法是這樣的:LINQ子句總是返回一個空列表

public async Task<List<Model>> GetAllByCode(string code) 
{ 
    using (var ctx = new DatabaseContext()) 
    { 
     return await ctx.Models.Where(m => m.Code.Equals(code)).ToListAsync(); 
    } 
} 

的是方法的結果,我創造我綁定到ComboBox在視圖中可觀察到的集合。

Models = new ObservableCollection<Model>(await ModelRepository.GetAllByCode("code")); 

的ObservableCollection總是空。我甚至可以在調試器中看到結果(如果我沒有弄錯,這是一個IEnumerableIQueryable集合)。我100%確定數據庫沒問題,因爲當我使用

return await ctx.Models.ToListAsync(); 

它返回數據庫中的所有行。

誰能告訴我我做錯了什麼?

編輯:
問題出在實體框架中。我仍然沒有找到解決方案,但是我的上下文不會從表中檢索新數據,而是總是需要緩存(我想)版本,即使我對每個請求都使用了一次性上下文。

雖然還沒有回答。

+0

你真的在'Code'字段中有'code'的值嗎? –

+1

當然,有任何模型與'm.Code ==「代碼」'?或者你是否打算寫'ModelRepository.GetAllByCode(code)'而不是'ModelRepository.GetAllByCode(「code」)'? – Clemens

+0

是的,我擁有它。我再次檢查它,即使是拼寫錯誤。 – Desomph

回答

0

的Equals可以在LINQ無法實體,如果代碼是不是字符串,你可以使用String.Compare()(m.Code as string).Equals()或這樣的:在表

public async Task<List<Model>> GetAllByCode(string code) 
{ 
    using (var ctx = new DatabaseContext()) 
    { 
     return await ctx.Models.Where(m => m.Code.ToLower() == code.ToLower()).ToListAsync(); 
    } 
} 

或檢查您輸入這一點,一步一個調試器一步:

public async Task<List<Model>> GetAllByCode(string code) 
{ 
    using (var ctx = new DatabaseContext()) 
    { 
     var all = await ctx.Models.ToListAsync(); 
     var result = all.Where(m => m.Code.Equals(code, StringComparison.InvariantCultureIgnoreCase))); 
     return result; 
    } 
} 

請注意,ObservableCollection不是線程安全的。

+0

我試過了,結果是一樣的。 'result'變量包含一個IEnumerable,但是當我調用'.ToList()'並從Repo返回時,observable集合仍然是空的。 – Desomph

+0

observalbeCollection不是線程安全的。那就是問題所在。 https:// stackoverflow。com/questions/23108045/how-to-make-observablecollection-thread-safe 但是,這兩個剪切工作正常與異步和等待! – cSteusloff

+0

這可能只是一個答案,要重新檢查,但我想我明白了。你可以用「非線程安全」編輯你的答案。 – Desomph