1

ビューに表示したいデータのViewModelを作成しようとしています。問題は、表示されているデータが2つのデータベースとそれぞれの中にある複数のテーブルに分散していることです。複数のコンテキスト間でLinqクエリを結合できないことを読みました。これは理にかなっています。また、EF5でコードファーストを使用してストアドプロシージャを使用することはできないことも読みました。 Linqクエリを実行し、それらを1つのViewModelに結合しようとします...そこに到達する方法がわかりません。

これが私のLinqクエリです:

var csdContext = new CSDContext(CustomerCode);
var masterContext = new MasterContext();

//Only returns 1 row - which is what we want.
List<Site> sites = (from s in csdContext.Sites
                join sa in csdContext.SiteAddresses
                    on s.SiteID equals sa.SiteID
                join a in csdContext.Addresses
                    on sa.AddressID equals a.AddressID
                join spv in csdContext.SiteProductVersions
                    on s.SiteID equals spv.ProductVersionID
                where s.SiteID == id
                select s).ToList();

//List
List<States> states = (from s in masterContext.StatesTable
                    select s).ToList();

私のViewModelは次のようになります。

public class SiteDetailsViewModel
{
    public string Address { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string StateCode { get; set; }
    public string ZipCode { get; set; }
    public string OfficePhone { get; set; }
    public string MobilePhone { get; set; }
    public string AlternativePhone { get; set; }
    public int ProductVersionID { get; set; }
}

基本的に、これらのテーブルから次のデータが必要です 。csdContext-
住所住所
住所2 市 の郵便番号



csdContext-サイト
OfficePhoneMobilePhoneAlternativePhone _


csdContext-SiteProductVersions
ProductVersionID

masterContext-状態
StateCode

SQLでテーブルを結合する方法は次のとおりです。

SELECT csd_a.Address, csd_a.Address2, csd_a.City, mstr_st.StateCode, csd_a.ZipCode, csd_s.OfficePhone, csd_s.MobilePhone, 
csd_s.AlternativePhone, csd_spv.ProductVersionID
FROM CSD.dbo.Sites AS csd_s 
INNER JOIN  CSD.dbo.SiteAddress AS csd_sa ON csd_sa.SiteID = csd_s.SiteID 
INNER JOIN  CSD.dbo.Address AS csd_a ON csd_a.AddressID = csd_sa.AddressID 
INNER JOIN CSD.dbo.SiteProductVersions AS csd_spv ON csd_s.SiteID = csd_spv.SiteID 
INNER JOIN MasterDB.dbo.States AS mstr_st ON mstr_st.StateID = csd_a.StateID 

これらの3つの結果をマージして、SiteDetailsViewModelのViewModelデータを作成する方法がわかりません。誰か助けてもらえますか?

4

3 に答える 3

1

OPで説明されているようにクエリを具体化する場合は、次を使用できます。

var query = sites.Join(
            states,
            si => si.StateID,
            st => st.StateID,
           (si, st) => new SiteDetailsViewModel
                        {
                             Address = si.Address,
                             Address2 = si.Address2,
                             City = si.City,
                             StateCode = st.StateCode,
                             ZipCode = si.ZipCode,
                             OfficePhone = si.OfficePhone,
                             MobilePhone = si.MobilePhone,
                             AlternativePhone = si.AlternativePhone,
                             ProductVersionID = siProductVersionID
                        });
于 2013-01-15T15:51:09.290 に答える
0

考えられる代替ソリューションの1つは、DB#1のテーブルのDB#2にビューを作成することです。次に、EF for DB#2でこれらのビューをモデル化/マッピングできます。もちろん、テーブルのいずれかを更新する必要がある場合は、DB#1のコンテキストが必要です。ただし、このソリューションの利点は、単一のコンテキストですべての読み取りアクセスを実行し、メモリではなくサーバーで結合を取得できることです。

于 2013-01-15T16:24:41.000 に答える
-1

では、次のように書いてみませんか。

from ...
...
where s.SiteID == id
select new SiteDetailsViewModel()
{
    Address = sa.Address,
    Address2 = as.Address2,
    ..
}
于 2013-01-15T15:45:44.767 に答える