在我的MVC项目中,我使用EF,其中实体(edmx)是通过使用Rocket U2从Universe DB生成的。 在edmx生成之后,我觉得这将是LINQ数据检索的直接业务,但它并不是因为我直接用我非常简单的第一个LINQ语句偶然发现问题,如下所示
1. var test1 = userRepo.QueryAll().Where(x => x.Code == model.UserName);
// generated SQL
FROM User AS Extent1
WHERE (Extent1.Code = ?) OR ((Extent1.Code IS NULL) AND (? IS NULL))}
简单不是吗?实际上它并不像我到目前为止所经历的那样,当我将属性值传递给where子句时,LINQ生成的SQL语句非常奇怪,而下面的语句执行完全正常,我有硬编码值
2. var test1 = userRepo.QueryAll().Where(x => x.Code == "JK");
// generated SQL
FROM User AS Extent1
WHERE 'JK' = Extent1.Code}
现在,如果我回到我的第一个LINQ查询,我注意到,如果我在where子句i-e之前枚举结果,它将起作用。如下
3. var test = userRepo.QueryAll().ToList().Where(x => x.Code == model.UserName);
可以请任何人解释我在这里做错了什么。虽然,我可以在应用过滤器之前枚举结果,但这不适合以后开发,我必须使用连接等。
即使直接使用DbContext而不是单个存储库,上述行为也是一样的。