0

ラムダ式の下に記述して、一致する appguid をチェックし、何も見つからない場合は代わりにハードコードされた guid を探すにはどうすればよいですか?

public static string ActiveDirectory(string xmlPath, string applicationGUID,string Element)
{
    XDocument dbConfig = XDocument.Load(xmlPath);

    return (dbConfig
                     .Descendants("Zone")
                     .Where(a =>
                     {
                         XElement ag = a.Element("ApplicationGUID");
                         return ag != null &&
                                (ag.Value == applicationGUID || ag.Value == "3773e594efga42688cd5113cf316d4d3");
                     })
                     .Select(
                         a =>
                         {
                             XElement cs = a.Element(Element);
                             return cs == null
                                        ? null
                                        : cs.Value;
                         })
                     .SingleOrDefault());
}

これは私のxmlがどのように見えるかです

<Zone>

        <ApplicationGUID>69b150127e7d43efa0e3e896b94953de</ApplicationGUID>
        <isActiveDirectory>true</isActiveDirectory>
        <ActiveDirectoryPath>LDAP://test.org</ActiveDirectoryPath>
        <DomainName>test1</DomainName>
    </Zone>
  <Zone>
           <ApplicationGUID>3773e594efga42688cd5113cf316d4d3</ApplicationGUID>
    <!--Default App guid-->
    <isActiveDirectory>true</isActiveDirectory>
    <ActiveDirectoryPath>LDAP://test.org</ActiveDirectoryPath>
    <DomainName>test2</DomainName>
  </Zone>
</Zones>
4

2 に答える 2

0

次のような 2 番目のクエリでデフォルトに戻ります...

public static string ActiveDirectory(string xmlPath, string applicationGUID, string Element)
{
    XDocument dbConfig = XDocument.Load(xmlPath);

    var ret = (dbConfig
                     .Descendants("Zone")
                     .Where(a =>
                     {
                         XElement ag =
                             a.Element("ApplicationGUID");

                         return ag != null &&
                                (ag.Value == applicationGUID);
                     })
                     .SingleOrDefault());

    if(ret == null)
       ret = (dbConfig
                     .Descendants("Zone")
                     .Where(a =>
                     {
                         XElement ag =
                             a.Element("ApplicationGUID");

                         return ag != null &&
                                (ag.Value == "3773e594efga42688cd5113cf316d4d3");
                     })
                     .SingleOrDefault());

    if(ret != null)
    {
           XElement cs = ret.Element(Element);

           return cs == null ? null : cs.Value;
    }

    return null;
}

トリックを使って単一のステートメントにすることもできますが、なぜステートメントを難読化するのでしょうか。XML がそれほど長くなく、この関数が何度も呼び出されないと仮定すると、これがボトルネックになることはほとんどなく、結果としてコードが読みやすく理解しやすくなります。

ただし、本当に 1 つのステートメントだけが必要な場合は、次のように使用OrderByして優先度を設定できます。

public static string ActiveDirectory(string xmlPath, string applicationGUID,string Element)
{
XDocument dbConfig = XDocument.Load(xmlPath);

return (dbConfig
                 .Descendants("Zone")
                 .Where(a =>
                 {
                     XElement ag =
                         a.Element("ApplicationGUID");

                     return ag != null &&
                            (ag.Value == applicationGUID || ag.Value == "3773e594efga42688cd5113cf316d4d3");
                 })
                 .OrderBy(a => a.Element("ApplicationGUID").Value == "3773e594efga42688cd5113cf316d4d3" ? 1 : 0)
                 .Select(
                     a =>
                     {
                         XElement cs =
                             a.Element(Element);

                         return cs == null
                                    ? null
                                    : cs.Value;
                     })
                 .FirstOrDefault());
}

これOrderByにより、Guid が静的なものではない場合に順序付けの優先度が与えFirstOrDefaultられ、最も優先度の高い一致を取得するために使用されますag.Value == applicationGuid。上記のように、null である場所を除外するa.Element(...)ため、最初に null でないことを確認しないことに注意してください。Where

于 2013-06-11T21:35:11.703 に答える
0

You are selecting SingleOrDefault() at the end of your statement. In your example data, you have two matches to the Where() Func provided. SingleOrDefault returns a single member if there is a single match, the default of the return type if there are no matches, or throws an exception. In your case, two matches, thus an exception.

The easiest solution to what it looks like you're trying to do would be to just run two queries. First check if the passed ID has a match, if it doesn't, look for a match with your hard coded value.

于 2013-06-11T21:37:31.887 に答える