そのため、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 で「結合」を使用する必要さえありますか? どんなアイデアでも大歓迎です!