2

我想知道是否有使用 Linq 的方法或更有效的方法。除了使用 while 循环,是否可以选择使用Linq 查询的位置?

  public UserPrincipal GetUser(string sUserName, string spwd, string domain, string ou)
    {
        PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, domain, ou, sUserName, spwd);


        UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, sUserName);

        DirectoryEntry user = (DirectoryEntry)oUserPrincipal.GetUnderlyingObject();
        PropertyCollection pc = user.Properties;
        IDictionaryEnumerator ide = pc.GetEnumerator();

        ide.Reset();

        while (ide.MoveNext())
        {
            PropertyValueCollection pvc = ide.Entry.Value as PropertyValueCollection;
            if (ide.Entry.Key.ToString() == "XYZ")
            {
                //Response.Write(string.Format("name: {0}", ide.Entry.Key.ToString()));
                //Response.Write(string.Format("Value: {0}", pvc.Value));

            }

        }
    .......;
    .......;


    }

谢谢!

4

3 回答 3

1

您不能Where()在 a上使用的原因PropertyCollection是因为它实现了 non-generic IEnumerable, whenWhere()是只有泛型版本的方法。您可以使用将 a 转换PropertyCollection为泛型。IEnumerableCast<T>()

var matches = pc.Cast<DictionaryEntry>().Where(p => p.Key.ToString() == "XYZ");

foreach( var match in matches )
{
    Response.Write(string.Format("name: {0}", match.Key));
    Response.Write(string.Format("Value: {0}", match.Value));
}

这种方式无疑更有效。

于 2012-08-27T23:55:10.383 回答
0

尝试这个:

        foreach (PropertyValueCollection pvc in pc.OfType<PropertyValueCollection>().Where(v => v.PropertyName == "XYZ"))
        {
            Response.Write(string.Format("name: {0}", pvc.PropertyName));
            Response.Write(string.Format("Value: {0}", pvc.Value));
        }

此外,您可以尝试使用ForEach

        pc.OfType<PropertyValueCollection>()
          .Where(v => v.PropertyName == "XYZ")
          .ToList()
          .ForEach(pvc =>
          {
              Response.Write(string.Format("name: {0}", pvc.PropertyName));
              Response.Write(string.Format("Value: {0}", pvc.Value));
          });
于 2012-08-27T23:51:23.893 回答
0

这是一个非常古老的线程,但我正在寻找一种使用 LINQ 处理 PropertyCollection 的方法。我尝试了建议的方法,但在转换到 DictionaryEntry 时总是得到一个无效的转换异常。有了 DictionaryEntry,像 FirstOrDefault 这样的东西就很时髦。所以,我只是这样做:

var directoryEntry = adUser.GetUnderlyingObject() as DirectoryEntry;
directoryEntry.RefreshCache();
var propNames = directoryEntry.Properties.PropertyNames.Cast<string>();
var props = propNames
    .Select(x => new { Key = x, Value = directoryEntry.Properties[x].Value.ToString() })
    .ToList();

有了这些,我就可以轻松地直接通过 Key 查询任何属性。使用合并和安全导航运算符允许默认为空字符串或其他任何内容。

var myProp = props.FirstOrDefault(x => x.Key == "someKey"))?.Value ?? string.Empty;

请注意,“adUser”对象是 UserPrincipal 对象。

于 2016-10-21T04:53:32.953 回答