2012-03-28 88 views
2

我想返回从Linq中的查询中获取的匿名数据。我不知道哪种列表<>返回,因为数据是“var”匿名。未知数据返回linq到xml查询的数据类型

  public List<?????> QueryXmlUserLogin() 
     { 
      var data = from item in XDocumentObj.Descendants("User_Data") 
        select new 
        { 
         user = item.Element("user").Value, 
         password = item.Element("password").Value, 
        }; 

     data.ToList(); 

     return ???? 
+1

就在方的想法,看着变量名,你不存储密码,你呢? – oleksii 2012-03-28 13:14:35

+0

我的确如此,但contais XDocument加密的文件 – kmxillo 2012-03-28 13:26:33

+1

那么它的安全性并不是最好的想法,如果你加密一个文件甚至加密每个密码或两者并不重要。它是一个相当大的攻击载体,黑客可以获得加密密钥并解密文件/密码。更安全的方法是存储生成的强密码密码。因此你根本不存储密码,只有一个不可逆的“垃圾”。每次用户登录时,都会重新应用散列提供的密码并将其与存储的散列进行比较。但是,如果您关心该应用程序的安全性,则这种情况取决于您。 – oleksii 2012-03-28 13:44:18

回答

3

两个数据类型浮现在脑海中,这取决于它们的预期使用量的Tuple<string, string>KeyValuePair<string, string>:但是

public List<Tuple<string, string>> QueryXmlUserLogin() 
{ 
    var data = from item in XDocumentObj.Descendants("User_Data") 
       select Tuple.Create(item.Element("user").Value, item.Element("password").Value); 

    return data.ToList(); 
} 

使用这些,往往可以掩盖返回类型的含义。由于该方法是公共的,你可能会更好地为工作创建一个新类:

public class UserCredentials 
{ 
    public string Username {get; set; } 
    public string Password {get; set; } 
} 

public List<UserCredentials> QueryXmlUserLogin() ... 

顺便说一句,(基于变量名)中明文保存密码时不应该做的。道歉,如果我不正确地解释变量或你的例子是人为的,但如果任何人在这篇文章中绊倒 - 密码(和独特的盐)的散列应该被存储,而不是明文密码。

+0

谢谢,它解决了我的问题。 – kmxillo 2012-03-28 13:22:59

1

我不会返回匿名类型,因为他们有这个问题。也许你应该创建一个新的数据结构,构建它,然后返回一个List<T>

1

您可以创建一个类型,例如:

class Person { 
    public string User { get; set; } 
    public string Password { get; set; } 
} 

然后使用:

public List<Person> QueryXmlUserLogin() 
{ 
    var data = from item in XDocumentObj.Descendants("User_Data") 
     select new Person 
     { 
       User = item.Element("user").Value, 
       Password = item.Element("password").Value, 
     }; 

    return data.ToList(); 
}