2017-09-27 87 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