0

そのため、LINQ に変換された (動作テスト済みの) SQL クエリに問題がありますが、同じ LINQ クエリは Lightswitch では動作しません。もちろん、すぐにうまくいくとは思っていませんでしたが、適切に変換するのに苦労しています。

したがって、クエリのベースとなるテーブルの画像は次のとおりです。

http://dl.dropbox.com/u/46287356/tables.PNG

(外部リンクで申し訳ありませんが、十分な担当者ポイントがありません:))

SQL クエリは次のとおりです。

SELECT WorkingUnits.Name AS WUName, ContractPositions.WUInstanceId,
   Materials.Cost, BillingValues.Value, BillingValues.PricePerUnit
FROM WorkingUnits 
  INNER JOIN
   Materials ON WorkingUnits.Id = Materials.Material_WorkingUnit 
  INNER JOIN ContractPositions ON 
   Materials.Id = ContractPositions.ContractPosition_Material 
  INNER JOIN BillingValues ON 
   ContractPositions.Id = BillingValues.BillingValue_ContractPosition

これを次の方法で LINQ に変換しました。

 var query = from wu in this.DataWorkspace.ApplicationData.WorkingUnits
             join m in this.DataWorkspace.ApplicationData.Materials on 
                new { Id = WorkingUnits.Id } equals new { Id = m.Material_WorkingUnit }
             join cp in this.DataWorkspace.ApplicationData.ContractPositions on 
                new { Id = m.Id } equals new { Id = cp.ContractPosition_Material }
             join bv in this.DataWorkspace.ApplicationData.BillingValues on 
                new { Id = cp.Id } equals new { Id = bv.BillingValue_ContractPosition }
             select new
             {
                 usage = bv.Value * bv.PricePerUnit,
                 totalCost = (bv.Value * bv.PricePerUnit) * m.Cost, 
                 amount = (bv.Value*bv.PricePerUnit) * m.Cost / wu.WUPrice
             };

Lightswitch では必要ないため、列のセクションなど、いくつか変更したことに注意してください。

したがって、これは SQL サーバーに対して機能しますが、Lightswitch は、範囲変数 'WorkingUnits' の型を明示的に指定することを検討する必要があると不平を言います。キャストしようとしましたが、次のような他のエラーがあります。

 'int' does not contain a definition for 'Id' and no extension method 'Id' 
  accepting a first argument of type 'int' could be found (are you missing 
  a using directive or an assembly reference?)

私の質問は、そのクエリを適切に変換して、それが機能することを期待するにはどうすればよいですか? また、データベースが正しくセットアップされている場合、LINQ で「結合」を使用する必要さえありますか? どんなアイデアでも大歓迎です!

4

2 に答える 2

0

このようなことを試してください

var query = from wu in this.DataWorkspace.ApplicationData.WorkingUnits
                 join m in this.DataWorkspace.ApplicationData.Materials on 
                   wu.Id  equals m.WorkingUnitID }
                 join cp in this.DataWorkspace.ApplicationData.ContractPositions on 
                    m.Id  equals cp.ContractPosition_Material 
                 join bv in this.DataWorkspace.ApplicationData.BillingValues on 
                   cp.Id equals bv.BillingValue_ContractPosition 
                 select new
                 {
                     usage = bv.Value * bv.PricePerUnit,
                     totalCost = (bv.Value * bv.PricePerUnit) * m.Cost, 
                     amount = (bv.Value*bv.PricePerUnit) * m.Cost / wu.WUPrice
                 };
于 2013-01-31T09:17:14.800 に答える
0

一番下 (BillingValues) から始めて、エンティティ参照を使用して上に向かっていくのはどうですか?

例えば

  var query = from bv in this.DataWorkspace.ApplicationData.BillingValues
     let m = bv.ContractPosition.Material  
     let wu = m.WorkingUnit
     select new
     {
          usage = bv.Value * bv.PricePerUnit,
          totalCost = (bv.Value * bv.PricePerUnit) * m.Cost, 
          amount = (bv.Value*bv.PricePerUnit) * m.Cost / wu.WUPrice
     };
于 2013-01-31T11:35:19.877 に答える