为什么我无法访问对象模型的属性?

时间:2011-08-26 15:31:48

标签: c# linq entity-framework

由于某些奇怪的原因,我无法访问此对象的属性,如果我将其作为模型类型进行转换。有没有人知道为什么? (这可能很明显,但我对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,但它根本没有帮助。

3 个答案:

答案 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!