QA@IT
«回答へ戻る

回答を投稿

List<T> 型のオブジェクトを「データベース D1のテーブル Table01」と「データベース D2のテーブル Table02」のそれぞれに作って、それを linq で join すれば可能と思います。

実際には DB は別ではないですが、以下のようにして期待通りに join された結果が得られることは確認できました。(ASP.NET MVC で マイクロソフトが提供しているサンプルデータベース AdventureWorksLT_Data.mdf から Visual Studio のウィザードを利用して EDM を作成しています)

ToList() がないと "System.NotSupportedException: 指定された LINQ 式には、別のコンテキストに関連付けられているクエリへの参照が含まれています。" という例外(多分、質問者さんのと同じ)がスローされます。

namespace Mvc4App.Controllers
{
    public class JoinedList
    {
        public int OrderID { get; set; }
        public int CustomerID { get; set; }
        public String CompanyName { get; set; }
    }

    public class AddressController : Controller
    {
        public ActionResult InnerJoin()
        {
            var db1 = new AdventureWorksLT_DataEntities();
            var db2 = new AdventureWorksLT_DataEntities();

            var list1 = (from s in db1.SalesOrderHeader select s).ToList();
            var list2 = (from c in db2.Customer select c).ToList();

            var list = from s in list1
                       join c in list2
                       on s.CustomerID equals c.CustomerID
                       select new JoinedList { OrderID = s.SalesOrderID, CustomerID = s.CustomerID, CompanyName = c.CompanyName };

            return View(list);
        }

        // ・・・中略・・・

    }
}
```List<T>``` 型のオブジェクトを「データベース D1のテーブル Table01」と「データベース D2のテーブル Table02」のそれぞれに作って、それを linq で join すれば可能と思います。

実際には DB は別ではないですが、以下のようにして期待通りに join された結果が得られることは確認できました。(ASP.NET MVC で マイクロソフトが提供しているサンプルデータベース AdventureWorksLT_Data.mdf から Visual Studio のウィザードを利用して EDM を作成しています) 

ToList() がないと "System.NotSupportedException: 指定された LINQ 式には、別のコンテキストに関連付けられているクエリへの参照が含まれています。" という例外(多分、質問者さんのと同じ)がスローされます。

```
namespace Mvc4App.Controllers
{
    public class JoinedList
    {
        public int OrderID { get; set; }
        public int CustomerID { get; set; }
        public String CompanyName { get; set; }
    }
    
    public class AddressController : Controller
    {
        public ActionResult InnerJoin()
        {
            var db1 = new AdventureWorksLT_DataEntities();
            var db2 = new AdventureWorksLT_DataEntities();

            var list1 = (from s in db1.SalesOrderHeader select s).ToList();
            var list2 = (from c in db2.Customer select c).ToList();

            var list = from s in list1
                       join c in list2
                       on s.CustomerID equals c.CustomerID
                       select new JoinedList { OrderID = s.SalesOrderID, CustomerID = s.CustomerID, CompanyName = c.CompanyName };

            return View(list);
        }

        // ・・・中略・・・

    }
}
```