3

私は3つのテーブルを持っています。

たとえば、ClientCompany、およびAddress

  • クライアントは会社への参照を取得しました。

  • 会社は Address (Billing と Shipping) に対して 2 つの null 可能な参照を持っているため、場合によっては Address が存在しない可能性があります。

結合クエリを作成する必要がありますが、 whenCompany.BillingAddressまたはCompany.ShippingAddressequalsnullの場合、すべてのデータを取得することはできません)。

私はそれを試しました(しかし、それは間違ったクエリです):

var res = (from client in context.Clients
    join clientCompany in context.Companies 
    on client.ClientCompanyId equals clientCompany.Id

    into clientCompanyJoin

    from company in clientCompanyJoin
    join addressBilling in context.Addresses
    on company.BillingAddressId equals addressBilling.Id

    join addressShipping in context.Addresses
    on company.ShippingAddressId equals addressShipping.Id

    select new
    {
        Client = client,
        Company = company,
        BillingAddress = ???????
        ShippingAddress = ???????
    }
);

結合クエリの作成またはその方法の説明を手伝っていただけませんか?

ありがとう。

4

2 に答える 2

6

次のコードスニペットを試してください。

var res = (from client in context.Clients
            join clientCompany in context.Companies 
            on client.ClientCompanyId equals clientCompany.Id
            into clientCompanyJoin
            from company in clientCompanyJoin
            join addressBilling in context.Addresses
            on company.BillingAddressId equals addressBilling.Id
            where !String.IsNullOrEmpty(addressBilling.Address)
            join addressShipping in context.Addresses
            on company.ShippingAddressId equals addressShipping.Id
            where !String.IsNullOrEmpty(addressShipping.Address)
            select new
            {
                Client = client,
                Company = company,
                BillingAddress = addressBilling.Address,
                ShippingAddress = addressShipping.Address
            });

追加:コメントによると、ここに必要なコードスニペットがあります。これで、の場合と同じかそれ以上の場合でも、クライアント会社のデータを取得できます。ShippingAddressIdBillingAddressIdnullLeft JoinSQL

var res = (from client in context.Clients
            join company in context.Companies 
            on client.ClientCompanyId equals company.Id
            join addressBilling in context.Addresses
            on company.BillingAddressId equals addressBilling.Id 
            into addrBillingGroup
            from gAddrBilling in addrBillingGroup.DefaultIfEmpty() // left join
            join addressShipping in context.Addresses
            on company.ShippingAddressId equals addressShipping.Id 
            into addrShippingGroup
            from gAddrShipping in addrShippingGroup.DefaultIfEmpty() // left join
            select new
            {
                Client = client,
                Company = company,
                BillingAddress = 
                    gAddrBilling == null ? null : gAddrBilling.Address,
                ShippingAddress = 
                    gAddrShipping == null ? null : gAddrShipping.Address
            });
于 2012-11-12T10:33:36.793 に答える
2

外部結合を行いたいと思います。顧客と注文の「Northwind」データベースでそれを行う方法の例を次に示します。

var ctx = new NorthwindDataContext();
var customers = from c in ctx.Customers
    join o in ctx.Orders
    on c.CustomerID equals o.CustomerID into inJoin
    from outJoin in inJoin.DefaultIfEmpty()
    orderby c.CustomerID, outJoin.OrderID
    select new
    {
        c.CustomerID,
        c.CompanyName,
        OrderID = (int?)outJoin.OrderID,
        OrderDate = (DateTime?)outJoin.OrderDate
    };
于 2012-11-12T10:26:05.307 に答える