2017-08-03 20 views
0

Customersのレコードのすべての列を列ShipToと区別して返す必要があります。私はDistinct()を使用して、このクエリを試してみましたが、それは重複したレコードを返します。異なる列の値に基づいて行全体を返すLinqクエリ

var query = (from o in Orders 
      from c in Customers 
      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).Distinct(); 

私はその後、Group ByFirst()を使用してクエリを書き換えてみました。私は構文エラーはありませんでしたが、LinqPadを使ってテストすると例外がスローされます。

var query = (from o in Orders 
      from c in Customers 
      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') 
      group c by c.ShipTo into g 
      select g.First()); 
+0

「'Customer'のすべての列:そのIDで最大1人の顧客がありますので

var qCustomer = from c in Customers where c.CustomerId == customerId && ( from co in CustomerOrders where co.CustomerId == c.CustomerId && co.OrderType != 'A' join o in Orders on co.OrderType equals o.OrderId where o.OrderStatus != 'C' && o.ShipTo == c.ShipTo select 1 ).Any() select c; 

または同等

var qCustomer = ( from c in Customers join co in CustomerOrders on c.CustomerId equals co.CustomerId join o in Orders on co.OrderId equals o.OrderId where c.CustomerId == customerId && co.OrderType != 'A' && o.OrderStatus != 'C' && c.ShipTo == o.ShipTo select c ).Distinct(); 

:に来る

「ShipTo」とは別のものは矛盾のように聞こえる。 – tinudu

答えて

0

Duh! orderby c.ShipToを追加する必要がありました。それは今、私のために働いています。私が正しく理解していれば

var query = (from o in Orders 
      from c in Customers 
      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') 
      orderby c.ShipTo 
      select c).Distinct(); 
+0

それでも 'ShipTo'カラムでは' Distinct() 'は実行されません。 – NetMage

0

は、あなたが望むすべての顧客(各1回)任意の注文は、顧客のと注文のShipToが同じプラスOrderTypeOrderStatus上の他のいくつかの制約であるCustomerOrders経由で割り当てられていること(フィルタをcustomerIdに設定すると、結果セットを最大1に制限するように見えます)。

var customerOrNull = qCustomer.SingleOrDefault(); 
関連する問題