次のように構成されたテーブルがある場合はどうなりますか?
X-Y
3/10
5/7
2/15
つまり、これらはある種の座標です。LINQ to SQLを介してSQLサーバーテーブルにそれらを書き込むにはどうすればよいですか?
つまり、グラフの座標点を1つのテーブルに保存するにはどうすればよいですか?
次のように構成されたテーブルがある場合はどうなりますか?
X-Y
3/10
5/7
2/15
つまり、これらはある種の座標です。LINQ to SQLを介してSQLサーバーテーブルにそれらを書き込むにはどうすればよいですか?
つまり、グラフの座標点を1つのテーブルに保存するにはどうすればよいですか?
はい。通常のデータベーステーブルは、このように「2-d」です。1つのディメンションに名前とタイプがあり、別のディメンションに0以上の行がある列のセットがあります。
これは、2次元空間内の空間内の点を表す「X」および「Y」とは関係がないことに注意してください。3次元空間のポイントを表す「X」、「Y」、「Z」がある場合でも、データは2次元のままです。
そのため、他のデータベーステーブルと同じであるため、Linq2Sql、EntityFramework、Linq2NHibernate、またはその他のlinqのデータベースクエリソースを使用して、テーブルに書き込みます。たとえば、Linq2SQLを使用すると、テーブルから取得したエンティティのフィールドを変更したり、またはを使用して新しいレコードを追加しInsertOnSubmit()
たりして、データコンテキストを呼び出すことができます。InsertAllOnSubmit()
SubmitChanges()
Linq2SQLの例を見てみましょう。ただし、他のアプローチについてもほとんど同じことが言えます。
最初にSQLでテーブルを作成しましょう(または、逆の場合もあります。個人的には、それぞれを手動で個別に作成することを好みますが、SQLからC#を作成するツールとC#からSQLを作成するツールの両方があります)。
CREATE TABLE Coordinates
(
id int identity primary key not null,
x int not null,
y int not null
)
厳密には列は必要ありませんid
が、特に同じxとyのインスタンスを複数持つ場合は、さまざまな点で作業が楽になります。更新を可能にします。
さて、次のビットは実際よりも複雑に見えるでしょう。実際には、これがDBの調査から作成されたDBMLから作成された場合は、partial
ほとんどの実装を確認する必要のないファイルに配置するために使用されます。それ以外の場合、手動で実行している場合は、共通クラスからの継承を使用して、これに対する繰り返しの多くで再利用を使用できます。
[Table(Name="dbo.Coordinates")]
public class Coordinate : INotifyPropertyChanging, INotifyPropertyChanged
{
public event PropertyChangingEventHandler PropertyChanging;
public event PropertyChangedEventHandler PropertyChanged;
private int _id;
private int _x;
private int _y;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(name));
}
protected void OnPropertyChanging(string name)
{
PropertyChangingEventHandler handler = PropertyChanging;
if (handler != null)
handler(this, new PropertyChangingEventArgs(name));
}
[Column(Storage = "_id", AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)]
public int Id
{
get
{
return _id;
}
set
{
if(_id != value)
{
SendPropertyChanging("Id");
_id = value;
SendPropertyChanged("Id");
}
}
}
[Column(Storage = "_x", DbType = "Int NOT NULL")]
public int X
{
get
{
return _x;
}
set
{
if(_x != value)
{
SendPropertyChanging("X");
_x = value;
SendPropertyChanged("X");
}
}
}
[Column(Storage = "_y", DbType = "Int NOT NULL")]
public int Y
{
get
{
return _y;
}
set
{
if(_y != value)
{
SendPropertyChanging("Y");
_y = value;
SendPropertyChanged("Y");
}
}
}
}
言ったように、これはあなたが実際に扱っているものよりも物事を少し悪く見せています。ほとんどの場合、クラスは次のように考えることができます。
public class Coordinate
{
public int Id { get; set; }
public int X { get; set; }
public int Y { get; set; }
}
それでも、これがあなたが心配しなければならないすべてであるにもかかわらず、他のアプローチを好む何人かの人々は定型文の量を彼らの議論の1つにします。
とにかく、これらすべてを処理できるdatacontextクラスもあります。呼び出すdb.GetTable<Coordinate>()
と、データベース内のテーブルを表すオブジェクトが返されます。これは頻繁に行うため、派生したクラスにプロパティを作成するのが一般的DataContext
です。これにより、次のことが可能になります。
public Table<Coordinate> Coordinates
{
get { return GetTable<Coordinate>(); }
}
(繰り返しますが、DBMLを使用して、これを実行してください)。
それでは、3つの座標のサンプルリストを追加することから始めましょう。
using(var db = new OurDataContext(connString))
{
var tab = db.Coordinates;
tab.InsertOnSubmit(new Coordinates{X=3,Y=10});
tab.InsertOnSubmit(new Coordinates{X=5,Y=7});
tab.InsertOnSubmit(new Coordinates{X=2,Y=15});
db.SubmitChanges();
}
(SQL挿入の束になります)
これまでのところ、とても退屈です。代わりに500個の新しいエントリを追加しましょう。
private static IEnumerable<Coordinate> ProduceRandomCoordinates(int num)
{
var rnd = new Random();
while(num-- > 0)
yield return new Coordinate{X=rnd.Next(-100, 101), Y=rnd.Next(-100, 101)};
}
using(var db = new OurDataContext(connString))
{
var tab = db.Coordinates;
tab.InsertAllOnSubmit(ProduceRandomCoordinates(500));
db.SubmitChanges();
}
(SQL挿入の束になります)
私たちが持っている数を調べましょう:
using(var db = new OurDataContext(connString))
Console.WriteLine(db.Coordinates.Count());
(SQLになりますSELECT COUNT(*) from Coordinates
);
XがYよりも大きい場所がいくつあるかを調べてみましょう。
using(var db = new OurDataContext(connString))
Console.WriteLine(db.Coordinates.Count(co => co.X > co.Y)
(SQLになりますSELECT COUNT(*) FROM Coordinates where x > y
)
XとYの両方で正ではないものをすべて削除しましょう
using(var db = new OurDataContext(connString))
{
var tab = db.Coordinates;
tab.DeleteAllOnSubmit(tab.Where(co => co.X < 0 || co.Y < 0));
db.SubmitChanges();
}
などなど。本当に便利なクエリは、複数のテーブルを結合し、基準に基づいてサブセットを選択し、データベース全体の状態に関する重要な情報を含む匿名オブジェクトにそれらを適合させるクエリです。