由于某些奇怪的原因,我无法访问此对象的属性,如果我将其作为模型类型进行转换。有没有人知道为什么? (这可能很明显,但我对C#很陌生,所以请耐心等待!:o))
Users currentUser = new Users();
currentUser = (from x in db_tc.Users where x.Id == Convert.ToInt32(User.Identity.Name) select x);
当我致电currentUser
时,我只能访问CRUD方法和名为List<Users>
的{{1}}属性。我没有创建列表定义,所以我想这是自动创建的Entity框架的一部分。
我确实尝试在实体查询之前使用usrList
投射currentUser
,但它根本没有帮助。
答案 0 :(得分:8)
那是因为您只创建了查询,但实际上并没有执行它。添加Single()
(或First()
等)以获得结果:
var currentUser = (from x in db_tc.Users where x.Id == Convert.ToInt32(User.Identity.Name) select x).SingleOrDefault();
Single()
:获取序列的第一个元素,但如果序列中有多个元素,则在没有找到元素时会抛出异常或。First()
:获取序列的第一个元素,但如果没有找到元素则会抛出异常。SingleOrDefault()
和FirstOrDefault()
:与上述相同,但会返回default(T)
而不是抛出空序列。 LINQ的这种“延迟执行”方面可能是最难理解的部分。基本思想是您可以使用查询操作(Where()
,Select()
等)构建查询,然后您可以执行该查询以实际获取其结果,使用其中一个非延迟执行操作(Single()
,ToList()
等。)
答案 1 :(得分:2)
您在此处的操作将返回DB将返回的匹配列表,它是一个集合。
如果您打算只返回一条记录,只需将.First();
附加到您的linq查询的末尾。
同时删除此行Users currentUser = new Users();
并添加此var currentUser =...
答案 2 :(得分:0)
来自“良好的LINQ实践”旅行车的更多提示......
LINQ应该“通常”返回var,然后转换为您期望的数据类型。我发现的另一个好习惯是立即验证LINQ的返回,因为没有验证的任何使用都非常容易出现异常。例如:
var qUser = (from x in db.Users select x);
if (qUser != null && currentUser.Count() > 0)
{
List<User> users = (List<User>)qUser.ToList();
... process users result ...
}
每次LINQ查询后,not null和count大于0的检查应 required 。 ;)
不要忘记为SqlException包装try-catch!