Linq查询不填充属性

问题描述:

我有一个方法内部运行LINQ查询,这是被称为内部的for循环:Linq查询不填充属性

var allUsers = userRepository.getAll(); 

foreach (var user in allUsers) 
      { 
       UserWithExtras userWithExtras = createUserWithExtrasFromLoginName(user.LoginName); 
       int userId = userWithExtras.userId; 


      } 

-------------------------------------------- 
public static createUserWithExtrasFromLoginName(string loginName){ 
    var user = (from u in userDb.Users 
     where u.Login.ToLower().Equals(login.ToLower()) 
     select u); 
    int a = u.userId; 
} 

我有15个用户在我的数据库,第10用户ID为1到10,所有内容都被正确检索,之后,这些ID不再被正确填充,即按顺序,检索到的用户具有以下ID: 1,2,3,4,5,6,7, 8,9,10,11,10,10,0,0

我已经在createUserWithExtrasFromLoginName中的查询中追踪了问题,最后一次检索到的对象实际上有ID 0,事实上在db中ID为15

我已经检查了dbml文件,并且确保Delay Loaded被设置为false。无论是在dbml文件还是在数据库中,userId属性都被设置为主键。

任何帮助将非常感激。

+3

该方法看起来不像它甚至可以编译。在分配一个时,它会在哪里得到“u”? – Narnian

+0

应该'.Equals(login.ToLower())'实际上是'.Equals(loginName.ToLower())'? – Eonasdan

+0

对于你想达到的目标,你正在做很多db来回操作(或者我们错过了一些信息)。 – rtalbot

您使用LINQ查询的方法不指定返回值。从代码的外观来看,该方法应返回一个UserWithExtras对象。

+0

你是对的,我忘了添加该行,但是,它确实返回一个UserWithExtras。 – hnafar

从你发布的内容看来,你可以用一个LINQ查询代替所有这些。更多细节可能会有所帮助。

var userIds = from u in userDb.Users 
       where u.Login.ToLower().Equals(login.ToLower()) 
       select u.userId; 

这假定userRepository和userDb正在访问同一商店。在这种情况下,似乎有些混乱。通过查询所有用户,然后遍历用户并在登录名上查询所有用户的userId,您将执行WAY以上的工作(请参阅笛卡尔产品)。

+0

我不想获取ID列表,我试图获取用户列表,然后为每个用户将它传递给一个方法,该方法根据安全设置创建一个用户的子类,然后返回该实例。在编译和工作时,语法或应用程序逻辑并不重要,为了确保信息不会被不必要地暴露出来,我不得不删除一些代码行,问题是linq查询不会填充所有对象的ID,前10或11个正确填充,然后剩下的不是。 – hnafar

+0

您发布的代码甚至与您在此处描述的内容不相符。但是,我建议不要获取用户的完整列表,然后遍历该列表以基于安全设置构建列表。在第一的位置获得你需要的东西。 – rtalbot

感谢任何试图回答这个问题的人,我昨天试着回答我自己的问题,但是*没有让我,我基本上从dbml文件中删除Users表并重新插入它,并且问题得到解决。