2017-03-08 3 views
0

にエンティティフレームワークとLINQを使用して2つのテーブルを結合することはquery results 1カンマ区切り製品コードと数量は私がorderManagement.where「SalesOrderDetails」テーブルのためにC#で2つのテーブルを結合しようとしていますC#の

query results 2

「SalesOrder」を返しますテーブルリターンオーダーの詳細。 私はそれは、ストアドプロシージャを使用せずに、私がしたい完璧なoutput.same出力を与えるストアドプロシージャ

ALTER procedure [dbo].[SP_GetAllOrders] 
AS 
BEGIN 


SELECT 
    SalesOrder.OrderDate, 
    SalesOrder.OrderTitle, 
    SalesOrder.OrderPriority, 
    Customer.Lname, 
    Customer.Fname, 
    OrderType.OrderTypeName, 
    (
     SELECT 
      CAST(ProductCode AS varchar) + ':' + CAST(Quantity AS varchar) + ',' 
     FROM 
      SalesOrderDetails 
     WHERE 
      SalesOrderDetails.SalesOrderId = SalesOrder.SalesOrderId 
     FOR xml path('') 
    ) AS 'Product' 
FROM 
    SalesOrder 
    INNER JOIN Customer ON SalesOrder.CustomerId = Customer.CustomerId 
    INNER JOIN OrderType ON SalesOrder.OrderTypeId = OrderType.OrderTypeId 

END 

を書かれています。 私は、エンティティフレームワークは、LINQとC#asp.net.Iがここに

この

を立ち往生しています使用して同じ出力をしたいが、私は

TrainingDemoEntitiesエンティティ=新しいTrainingDemoEntities()を試してみましたものです。

var details = (from order in entity.SalesOrders 
        join cust in entity.Customers 
        on order.CustomerId equals cust.CustomerId 
        join ordertypevalue in entity.OrderTypes 
         on order.OrderTypeId equals ordertypevalue.OrderTypeId 
        select new 
        { 
         orderId = order.SalesOrderId, 
         orderDate = order.OrderDate, 
         orderTitle = order.OrderTitle, 
         orderPriority = order.OrderPriority, 
         orderType = order.OrderType, 
         productstr = string.Join(",", (from prod in entity.SalesOrderDetails 
                 where prod.SalesOrderId == order.SalesOrderId 
                 select prod.ProductCode + ":" + prod.Quantity)) 
        }).ToList(); 
+0

LINQを使用していくつかのサンプル結合をルックアップしてから最初に試し、達成したことを示す必要があります。あなたはここに来てコードを尋ねることはできません。 – Armin

+0

私はコードを求めているだけではありません。私は多くの異なる方法を試しました@Armin – user19041992

+0

データベースに外部キーの関係が設定されていますか? EFはこの関係を利用していますか? SQLで行うのではなく、コンピュータ上の結合を評価していたのは非効率です。 – Dai

答えて

0

EFを使用している場合は、ジョインについて考える必要はなく、モデル内のリレーションを使用できます。最初にデータを入手してください:

var res = (from so in context.SalesOrder 
      let productStrings = so.SalesOrderDetails 
        .Select(d => d.ProductCode.ToString() + ":" + d.Quantity.ToString()) 
      select new 
      { 
       OrderDate = so.OrderDate, 
       OrderTitle = so.OrderTitle, 
       OrderPriority = so.OrderPriority, 
       Lname = so.Customer.Lname, 
       Fname = so.Customer.Fname, 
       OrderTypeName = so.OrderType.OrderTypeName, 
       Products = productStrings 
      }).ToList(); 

製品は文字列のリストです。 Linq-sqlはstring.joinまたはaggregateを受け入れないため、データベースを呼び出した後に文字列を結合する必要があります。

上記の結果は匿名型ですが、あなたのDTOも選択することができます。その場合は、Productの結果を結合するProductList(string)のゲッターを追加することができます。そのような場合、結果を次のように処理する必要はありません。

  var details = res.Select(o => new DTO 
      { 
       OrderDate = o.OrderDate, 
       OrderTitle = o.OrderTitle, 
       OrderPriority = o.OrderPriority, 
       Lname = o.Lname, 
       Fname = o.Fname, 
       OrderTypeName = o.OrderTypeName, 
       Products = o.Products.Aggregate((a, b) => (a + ", " + b)) 
      }).ToList(); 

トップクエリは多くのレコードを返します。各製品(Excelなど)ごとに1つのレコード(すべての列を含む)。したがって、データベースを2回クエリすると、パフォーマンスが向上します。一度DTOにレコードを記入し、次に詳細を記入します。

関連する問題