18

Linq to Sql を使用した外部結合の例は多数ありますが、それらはすべて、DefaultIfEmpty()Linq to Entity Framework でサポートされていないことにかかっています。

これは、.NET 3.5 を使用した Linq to Entity では外部結合ができないことを意味しますか (DefaultIfEmpty が 4.0 に付属していることは理解していますが、現時点ではオプションではありません)。

Linq to EntityFramework を使用した簡潔な例を教えてください。

4

1 に答える 1

36

LINQ to Entities では、SQL 結合ではなくリレーションシップの観点から考えてください。Personしたがって、 1 対 0 または 1 のリレーションシップを持つエンティティの SQL 外部結合に相当する文字列は次のようにCustomerInfoなります。

var q = from p in Context.People
        select new
        {
            Name = p.Name,
            IsPreferredCustomer = (bool?)p.CustomerInfo.IsPreferredCustomer
        };

L2E は結合を結合するため、CustomerInfo が null の場合、式全体が null と評価されます。したがって、null 非許容 bool の推論された型はその結果を保持できなかったため、null 許容 bool へのキャストです。

1 対多の場合、通常、フラットな SQL スタイルの結果セットではなく、階層が必要です。

var q = from o in Context.Orders
        select new 
        {
            OrderNo = o.OrderNo,
            PartNumbers = from od in o.OrderDetails
                          select od.PartNumber
        }

これは、まだ詳細のない注文を取得する限り、左結合に似ていますが、SQL のような集合ではなく、OO のようなグラフです。

于 2009-11-20T14:45:59.247 に答える