Linq to SQL

[もどる]


 Visual Studio のソリューションエクスプローラで、プロジェクトを選択して「追加 / 新規作成 / データ」メニューから LINQ To SQL を選択する。名前を入力して「追加」ボタンをクリックすると、LINQ To SQL のデザイン画面が開く。

 画面は左右に分かれているが、左側にはテーブルを、右側にはストアドプロシージャをサーバーエクスプローラからドラッグ&ドロップする。この例では、ストアドプロシージャのみを使用している。


下のサンプルは、ストアド関数 SumOfAmountVisaCard、SumOfPayVisaCard、GetCountVisaCard を呼び出して、クレジットカードのある期間の合計金額と利用回数を求めている。

Module Module1
    ''' <summary>
    ''' ある期間中の利用額と支払額の合計を求める。
    ''' </summary>
    Sub Main(ByVal args() As String)
        ' パラメータの確認
        If args.Length < 2 Then
            Console.WriteLine("パラメータとして開始日と終了日をYYYY/MM/DD形式で指定してください。")
            Return
        End If

        ' 合計額を求める。
        Dim context As New VISACARDDataContext
        Dim amount = context.SumOfAmountVisaCard(args(0), args(1))
        Dim vAmount As Decimal = amount.First().SumOfAmount
        Dim pay = context.SumOfPayVisaCard(args(0), args(1))
        Dim vPay As Decimal = pay.First().SumOfPay
        Console.WriteLine("期間 {0} - {1}", args(0), args(1))
        Console.WriteLine("利用額の合計 {0:C}", vAmount)
        Console.WriteLine("支払額の合計 {0:C}", vPay)

        ' 利用回数を求める。
        Dim count = context.GetCountVisaCard(args(0), args(1))
        Console.WriteLine("利用回数 {0}", count?.ToString())

        Console.WriteLine("終了。")
#If DEBUG Then
        Console.ReadKey()
#End If
    End Sub

End Module


クレジットカードのデータは次のようなテーブルに格納されているものとする。

CREATE TABLE [dbo].[VISACARD] (
    [ID]       INT            IDENTITY (1, 1) NOT NULL,
    [DATE]     CHAR (10)      NOT NULL,
    [SHOP]     NVARCHAR (50)  NOT NULL,
    [AMOUNT]   MONEY          NOT NULL,
    [PAYCLASS] NCHAR (1)      NULL,
    [PAYCOUNT] INT            NOT NULL,
    [PAY]      MONEY          NOT NULL,
    [INFO]     NVARCHAR (100) NULL,
    PRIMARY KEY CLUSTERED ([ID] ASC)
);

ストアド関数の定義は以下のようになっている。

-- 利用金額の合計
CREATE FUNCTION [dbo].[SumOfAmountVisaCard]
(
	@fromDt char(10),
	@toDt char(10)
)
RETURNS TABLE AS RETURN
(
	SELECT SUM(AMOUNT) As SumOfAmount FROM dbo.VISACARD WHERE [DATE] >= @fromDt AND [DATE] <= @toDt
)

-- 支払金額の合計
CREATE FUNCTION [dbo].[SumOfPayVisaCard]
(
	@fromDt char(10),
	@toDt char(10)
)
RETURNS TABLE AS RETURN
(
	SELECT SUM(PAY) As SumOfPay FROM dbo.VISACARD WHERE [DATE] >= @fromDt AND [DATE] <= @toDt
)

-- =============================================
-- ある期間のカード利用回数を得る。
--   @fromDt  開始日
--   @toDt    終了日
-- =============================================
CREATE FUNCTION GetCountVisaCard 
(
  @fromDt char(10),
  @toDt   char(10)
)
RETURNS int
AS
BEGIN
	RETURN (
		SELECT COUNT(ID) FROM dbo.VISACARD WHERE [DATE] >= @fromDt AND [DATE] <= @toDt
	)
END

Entity Framework と LINQ to SQL

これら2つは同じようなもので、新しいのは Entity Framework であり、LINQ to SQL を高機能にしたものである。しかし、Entity Framework で、ストアド関数の呼び出しがうまくいかないことがあった。