6

Employee情報を含むコレクションをクエリしようとしています。そのコレクションを照会すると、各オブジェクトに 2 つのフィールドがあるオブジェクトの列挙を返したいと思います。

  • 名前
  • マネージャー名

(すべてのマネージャーも従業員であることに注意してください!)

さて、ここに私が抱えている問題があります。select内で aを実行すると、各オブジェクトで返されるフィールドselectの値は次のとおりです。ManagerName

System.Data.Common.Internal.Materialization.CompensatingCollection<string>

クエリは次のとおりです。

var query =
    from e in db.Employees    
    select new
    {
        Name = e.Name,
        ManagerName =
            from em2 in db.Employees
            where (em2.EmployeeID == e.ManagerID)
            select em2.Name
    };

具体的には、 の値をManagerName見ると、単一のアイテムを生成する列挙型であることがわかります。そして、単一のアイテムはマネージャーの名前を含む文字列です。だから、私は近いと思います。

質問:代わりに、各オブジェクトが 2 つの文字列フィールドを持つオブジェクトの列挙を返すようにクエリを変更するにはどうすればよいNameですManagerNameか?

4

2 に答える 2

17

これを試して:

var query = from e in db.Employees
            select new
            {
                Name = e.Name,
                ManagerName = db.Employees
                                .Where(x => x.EmployeeID == e.ManagerID)
                                .Select(x => x.Name).SingleOrDefault()
            };

ただし、データベースをEF (使用していると思われます) に正しくマップした場合は、利用できるナビゲーション プロパティが必要です。

var query = from e in db.Employees
            select new
            {
                Name = e.Name,
                ManagerName = e.Manager.Name
            };
于 2013-07-24T17:49:07.140 に答える
2

自己結合が機能するはずです:

var query = from e in db.Employees
            join m in db.Employees on e.ManagerID equals m.EmployeeID
              select new
              {
                Name = e.Name,
                ManagerName = m.Name
              };
于 2013-07-24T17:56:03.963 に答える