0

左外部結合で 2 つのテーブルを結合する LINQ ステートメントを作成しようとしています。

以下のコードはDataTable、ログインしたユーザーのために働く人々の (Active Directory ユーザー名を含む) を取得しDataTable、AD ユーザー名とアプリケーション ログイン名の間の相互参照である別のユーザーを取得し、それらを結合してアプリケーション ログイン名のList<string>いずれかを含むを作成します。 name (存在する場合) それ以外の場合は、ログインしたユーザーのために働くすべての人の AD ユーザー名。

ログインのリストに部下のリストに誰も含まれていない場合、NullReferenceExceptionエラーが(行上で)発生します。select new

ログインのリストに部下のリストに含まれている人が含まれている場合、InvalidCastExceptionエラーが(行で)発生します。return result...ここでの完全なエラーは次のとおりです。

System.InvalidCastException: タイプ '<>f__AnonymousType1`1[System.String]' のオブジェクトをタイプ 'System.String' にキャストできません

TMReportsDataSet.EmployeeDataTable subordinates = SessionTyped.Subordinates;
TMReportsDataSet.EmployeeLoginDataTable logins = CacheTyped.Logins;

var result = from t1 in subordinates.AsEnumerable()
             join t2 in logins.AsEnumerable()
             on t1.ADAccountName equals t2.ADAccountName
             into joinedDT
             from t2 in joinedDT.DefaultIfEmpty()
             select new
             {
                 userName = (string)(t2.LoginName ?? t1.ADAccountName)
             };

return result.Cast<string>().ToList<string>();
4

2 に答える 2

3

匿名型を文字列にキャストしようとしています。次のように、匿名型の使用を削除します。

var result = from t1 in subordinates.AsEnumerable()
                 join t2 in logins.AsEnumerable()
                 on t1.ADAccountName equals t2.ADAccountName
                 into joinedDT
                 from t2 in joinedDT.DefaultIfEmpty()
                 select (string)(t2.LoginName ?? t1.ADAccountName);

return result.ToList();
于 2013-03-11T17:20:12.870 に答える
2

Magnus の回答の編集が拒否されたため [理由がわかりませんか?] ここに私の質問に対する完全な回答があります。これは基本的に Magnus が提供した回答ですが、エラーが発生t2 == nullしないようにするかどうかを確認するための追加のチェックが含まれています。NullReferenceException

var result = from t1 in subordinates.AsEnumerable()
                 join t2 in logins.AsEnumerable()
                 on t1.ADAccountName equals t2.ADAccountName
                 into joinedDT
                 from t2 in joinedDT.DefaultIfEmpty()
                 select (string)(t2 == null ? "" : (t2.LoginName ?? t1.ADAccountName));

return result.ToList();
于 2013-03-11T17:50:26.017 に答える