2017-08-02 19 views
0

以下のOracle Sqlクエリをlinqに変換しようとしています。私が学んだAND ShipSeq = i.ShipSeq(+)という行を扱う方法がわからないのは、OracleのLEFT OUTER JOINです。 LinqPadのLinqクエリをテストしていますが、ここでは構文エラーはありませんが、クエリの実行時にエラーが発生します。何か案は?左外部結合を使用したOracle SQLクエリをLinqに変換する

のOracle SQLクエリ

SELECT * 
FROM CustomerShip, 
    (SELECT DISTINCT b.ShipSeq AS shipSeq 
    FROM Orders a, 
      CustomerShip b 
    WHERE a.OrderId IN (SELECT OrderId 
          FROM Orders 
          WHERE CustomerId = @CustomerId 
          AND OrderType <> 'A') 
    AND b.CustomerId = @CustomerId 
    AND b.ShipSeq = a.CustShip 
    AND OrderStatus <> 'C' 
    GROUP BY b.ShipSeq) i 
WHERE CustomerId = @CustomerId 
AND (Address NOT LIKE '%RETAIL%STORE%') 
AND ShipSeq = i.ShipSeq(+) 
ORDER BY ShipTo DESC, OrderDate DESC; 

LINQのクエリ

var query = from s in CustomerShip 
      join m in Orders on s.ShipTo equals m.ShipTo into temp 
      from x in temp.DefaultIfEmpty() 
      where (from o in Orders 
        from c in CustomerShip 
        where (from x in CustomerOrders 
          where x.CustomerId == customerId 
          && !x.OrderType.Equals("A") 
          select x.OrderId).Contains(o.OrderId) 
        && c.CustomerId == customerId 
        && c.ShipTo == o.ShipTo 
        && !o.OrderStatus.Equals("C") 
        select c.ShipTo).Distinct().Contains(s.ShipTo) 
      && s.CustomerId == customerId 
      && !s.Address.Contains("RETAIL") 
      && !s.Address.Contains("STORE") 
      orderby s.ShipTo descending, s.OrderDate descending 
      select s; 
+0

これは(https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b)を助けるかもしれない加入のセクションがあります –

答えて

0

私は直訳は次のようになりますと思う:

var iQuerySub = from o in Orders where o.CustomerId == pCustomerId && o.OrderType != "A" select o.OrderId; 

var iQuery = (from a in Orders 
       from b in CustomerShip 
       where iQuerySub.Contains(a.OrderId) && 
       b.CustomerId == pCustomerId && 
       b.ShipSeq == a.CustShip && 
       a.OrderStatus != "C" 
       group b by b.ShipSeq into bg 
       select new { shipSeq = bg.Key }).Distinct(); 

var ans = from s in CustomerShip 
      where s.CustomerId == pCustomerId && 
      (!s.Address.Contains("RETAIL") || !s.Address.Contains("STORE") || s.Address.IndexOf("RETAIL") > s.Address.IndexOf("STORE")) 
      join i in iQuery on s.ShipSeq equals i.shipSeq into ij 
      from i in ij.DefaultIfEmpty() 
      orderby s.ShipTo, s.OrderDate descending 
      select new { s, shipSeq = (i != null ? i.shipSeq : (int?)null) }; 

しかし、SQLとLINQの両方のように見えますインフィー私にcientが、ドメイン知識がなくても、これは私が最適化することができるすべてです:

var iQuery2 = (from b in CustomerShip 
       where b.CustomerId == pCustomerId && 
       Orders.Any(a => a.CustomerId == pCustomerId && a.OrderType != "A" && a.OrderStatus != "C" && b.ShipSeq == a.CustShip) 
       select new { shipSeq = b.ShipSeq }).Distinct(); 

var ans2 = from s in CustomerShip 
      where s.CustomerId == pCustomerId && 
      (!s.Address.Contains("RETAIL") || !s.Address.Contains("STORE") || s.Address.IndexOf("RETAIL") > s.Address.IndexOf("STORE")) 
      join i in iQuery2 on s.ShipSeq equals i.shipSeq into ij 
      from i in ij.DefaultIfEmpty() 
      orderby s.ShipTo, s.OrderDate descending 
      select new { s, shipSeq = (i != null ? i.shipSeq : (int?)null) }; 
+0

ありがとうございました。あなたの答えはほとんど私のために働いていますが、 'iQuery'クエリでLinqPadでテストするとエラーが出ます:' GROUP BY式ではありません ' – PixelPaul

+0

私は問題を特定したと思いますが、生成されたSQLを見ると、 'GROUP BY b.ShipSeq'がありますが、クエリの最初の行は' SELECT b.ShipSeq、c.OrderId'です。なぜ 'c.OrderId'がselect文中にあるのか不明ですか? – PixelPaul

+0

おそらく 'iQuerySub'が' OrderId'を必要とする 'where iQuerySub.Contains'を処理するために' iQuerySub'がLINQによってどのように実装されるのでしょうか。私は匿名のオブジェクトモデルでLINQPadを実行しましたが、明らかに私はあなたの実際のデータベースやスキーマを持っていないので、私のモデルが正しいかどうかわかりません - 翻訳で​​は、スキームなしまたは明白なエイリアス式に属します。 – NetMage

関連する問題