在活动目录底层对象上使用 linq
using linq on active directories underlying object
目前我的代码是:
using (var context = new PrincipalContext(ContextType.Domain, adDomain))
{
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
foreach (Principal result in searcher.FindAll())
{
DirectoryEntry entry = result.GetUnderlyingObject() as DirectoryEntry;
if (entry.Properties["Company"].Value?.ToString() == "My Company")
{
// do some stuff
}
}
}
}
我只是想知道是否可以执行 LINQ 语句而不是 if
语句来仅获取我感兴趣的条目。
像这样:
foreach (var entry in searcher.FindAll()
.Where(x => x.GetUnderlyingObject<DirectoryEntries>()
.Properties["Company"].Value?.ToString() == "MY Company"))
{
// do some stuff
}
是的,布赖恩,这看起来像是一个解决方案。我没有所有的类型来测试它,但是在末尾有一个 ToList() 以允许 foreach 迭代应该可以工作。
我会把它放在 var 中的 foreach 之上,以查看它在迭代之前生成的列表。
你不应该需要 foreach
。试试这个:
var myCompany = searcher.FindAll()
.Select(x => (DirectoryEntry)x.GetUnderlyingObject())
.Where(x => x.Properties["Company"].Value?.ToString() == "MY Company")
.ToList();
if (myCompany != null)
// Do something with myCompany
题外话:可以堆叠using
语句来消除一些嵌套:
using (var context = new PrincipalContext(ContextType.Domain, adDomain))
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
// Do stuff
}
应该是可以的。您可以先使用 Select()
将对象转换为 DirectoryEntry
。这样的事情应该有效:
var entry = searcher.FindAll()
.Select(x => (DirectoryEntry)x.GetUnderlyingObject())
.Where(x => x.Properties["Company"].Value?.ToString() == "My Company")
.FirstOrDefault(); // or .ToList() depending on your requirements
if (entry != null)
{
// do some stuff
}
目前我的代码是:
using (var context = new PrincipalContext(ContextType.Domain, adDomain))
{
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
foreach (Principal result in searcher.FindAll())
{
DirectoryEntry entry = result.GetUnderlyingObject() as DirectoryEntry;
if (entry.Properties["Company"].Value?.ToString() == "My Company")
{
// do some stuff
}
}
}
}
我只是想知道是否可以执行 LINQ 语句而不是 if
语句来仅获取我感兴趣的条目。
像这样:
foreach (var entry in searcher.FindAll()
.Where(x => x.GetUnderlyingObject<DirectoryEntries>()
.Properties["Company"].Value?.ToString() == "MY Company"))
{
// do some stuff
}
是的,布赖恩,这看起来像是一个解决方案。我没有所有的类型来测试它,但是在末尾有一个 ToList() 以允许 foreach 迭代应该可以工作。
我会把它放在 var 中的 foreach 之上,以查看它在迭代之前生成的列表。
你不应该需要 foreach
。试试这个:
var myCompany = searcher.FindAll()
.Select(x => (DirectoryEntry)x.GetUnderlyingObject())
.Where(x => x.Properties["Company"].Value?.ToString() == "MY Company")
.ToList();
if (myCompany != null)
// Do something with myCompany
题外话:可以堆叠using
语句来消除一些嵌套:
using (var context = new PrincipalContext(ContextType.Domain, adDomain))
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
// Do stuff
}
应该是可以的。您可以先使用 Select()
将对象转换为 DirectoryEntry
。这样的事情应该有效:
var entry = searcher.FindAll()
.Select(x => (DirectoryEntry)x.GetUnderlyingObject())
.Where(x => x.Properties["Company"].Value?.ToString() == "My Company")
.FirstOrDefault(); // or .ToList() depending on your requirements
if (entry != null)
{
// do some stuff
}