2011-08-26 94 views
1

由于某些奇怪的原因,即使将其作为模型类型转换,我也无法访问此对象的属性。有没有人有一个想法,为什么? (这可能是显而易见的,但我很新的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>属性调用usrList 。我没有创建列表定义,所以我想这是自动创建的Entity框架的一部分。

我曾尝试铸造currentUser(Users)实体查询之前,它根本没有帮助。

+0

你为什么要这样做'Convert.ToInt32(User.Identity.Name)'你的用户名总是数字?或者,您的ID列是实际名称,而不是标识列? – Jay

+0

@Jay这可能有点不方便,但USERS表中相应用户的用户ID当前被放置在User.Identity.Name中。我刚刚了解了身份验证Cookie的'UserData'属性,所以我将在不久的将来对其进行修改......我只是想先弄清楚这部分内容。谢谢你的帮助! – BobZavala

回答

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() and FirstOrDefault():与上面相同,但将返回default(T)而不是抛出空序列。

LINQ的这种“延迟执行”方面可能是最难理解的部分。基本思想是,您可以使用查询操作(Where()Select()等)构建查询,然后可以使用其中一个非延迟执行操作(Single())执行该查询以实际获取其结果,ToList()等)

2

您在这里的操作将返回数据库将返回的匹配列表,它是一个集合。 如果您打算只返回单个记录,则会在您的linq查询的末尾追加.First();

而且删除此行Users currentUser = new Users(); 并从“好LINQ做法”旅行车添加此var currentUser =...

0

一些更多的技巧......

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 ... 
} 

的不是null,数大于0检查应需要每个LINQ查询后。 ;)

并且不要忘记在try-catch中包装SqlException!

+1

'qUser!= null'是不必要的。构造的查询永远不会为空。我不确定我在这里遵循你的建议。 – dlev

+0

真的吗?所以在引用特定对象类型时首选匿名变量?如果可能的话,我的印象是你应该指定你要返回的对象的类型。例如'List objList =(从db_tc.Users中的u where u.ID == userID select u).ToList();'或甚至'Users qUser =(从db.Users中的x选择x);' – BobZavala

+0

@Bob using处理LINQ时''var'方法*更容易;实际上有很多种不同的类型,很难让它恰到好处。当然,如果你的查询生成一个匿名类型,它实际上是必需的。 – dlev

相关问题