2012-01-29 1 views
4

Я изучаю LINQ с F # 3.0. Я хочу знать, как переписать старый код для использования новых функций LINQ в F # 3.0. Например, я создал простую таблицу данных в SQL Server 2008 R2, имя базы данных - myDatabase.F # LINQ добавить новые строки в SQL Server

-- Create the Table1 table. 
CREATE TABLE [dbo].[Table1] (
    [Id]  INT  NOT NULL, 
    [TestData1] INT  NOT NULL, 
    [TestData2] FLOAT (53) NOT NULL, 
    [Name]  NTEXT  NOT NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

Для F # 2.0, я могу использовать Dataset для добавления новых строк, например:

#light 
open System 
open System.Collections.Generic 
open System.Data 
open System.Data.SqlClient 

let sqlConn = "server=(local); Integrated Security=True; Database=MyDatabase" 
let connDB = new SqlConnection(sqlConn) 
let sql = "SELECT * FROM Table1" 
let da = new SqlDataAdapter(sql, connDB) 
let ds = new DataSet() 
da.Fill(ds) |> ignore 
let commandBuilder: SqlCommandBuilder = new SqlCommandBuilder(da) 

for i = 0 to 1 do 
    let newDR: DataRow = ds.Tables.Item(0).NewRow() 
    newDR.Item(0) <- (i + 1) 
    newDR.Item(1) <- (i * 10) 
    newDR.Item(2) <- (decimal i) * 5.0M 
    newDR.Item(3) <- "Testing" + (i + 1).ToString() 
    ds.Tables.Item(0).Rows.Add(newDR) 
da.Update(ds) |> ignore 

Теперь с F # 3.0, как я могу переписать добавить новые строки кода лучше? Я думаю, что я могу wrtie некоторый код, как:

#light 
open System 
open System.Data.Linq 
open Microsoft.FSharp.Data.TypeProviders 
open Microsoft.FSharp.Linq 

[<Generate>] 
type dbSchema = SqlDataConnection<"Data Source=.;Initial Catalog=MyDatabase;Integrated Security=True"> 
let db = dbSchema.GetDataContext() 

try 
    db.DataContext.ExecuteCommand("INSERT INTO Table1 (Id, TestData1, TestData2, Name) VALUES (1, 10, 0.0, 'Testing1')") |> ignore 
with 
    | exn -> printfn "Exception:\n%s" exn.Message 

try 
    db.DataContext.ExecuteCommand("INSERT INTO Table1 (Id, TestData1, TestData2, Name) VALUES (2, 20, 5.0, 'Testing2')") |> ignore 
with 
    | exn -> printfn "Exception:\n%s" exn.Message 

Но я не думаю, что новый способ лучше, на самом деле, я думаю, что это еще хуже. В F # 2.0 я могу использовать код для генерации значений для таблицы данных, но если мне нужно написать статический оператор SQL, например «INSERT INTO Table1 VALUES (« с предварительно заданными значениями, то, я думаю, я предпочел бы вставлять записи данных по .? рука с SQL Server Management Studio, я могу видеть результаты сразу Каждый имеет лучшее представление об этом Спасибо, John

ответ

5

Вы можете использовать InsertOnSubmit и InsertAllOnSubmit для хорошо, статически типизированных вставки записи что-то подобное.:

let newRecords = 
    [for i in [0 .. 1] -> 
     new Table1(Id=(i + 1), TestData1=(i * 10), TestData2=(decimal i) * 5.0M, Name="Testing" + (i + 1).ToString())] 

db.Table1.InsertAllOnSubmit(newRecords) 
db.SubmitChanges() 

Также см http://msdn.microsoft.com/en-us/library/hh361033(v=vs.110).aspx и поиск в пределах страницы для «InsertOnSubmit »(на самом деле, пример приведен для демонстрационной таблицы Table1).

Смежные вопросы