Linq to Sql Dinamik Tablo Kullanımı

Veritabanınızda belli bir düzene göre aynı özelliklere sahip tablolarınız varsa bu yöntemi kullanabilirsiniz. Böylelikle değişken tablo yapısında işinizi çok kolaylaştıracaktır.

Neden böyle bir duruma ihtiyaç duydum?

Firmamda logo muhasebe programına entegrasyon sağlamaktayım. Logo veritabanında her seneye ait aynı özellikte tablolar bulunmaktadır. Örneğin “LG_XXX_tabloIsmi” tablo isminde her yıl “XXX” alanı değişmektedir. Böylelikle her yıl için metot yazmak mantıksız olmaktadır.

Nasıl Yaparım?

  • Türetilecek veritabanı tablolarını kullanacağınız .dbml dosyasına ekleyiniz.  (eklenen tabloların ismini değiştirmek için xml dosyasını yaratacağız)
  • Visual Studio Command Prompt ‘u açıyoruz ve yarattığımız .dbml dosyasını path’ini veriyoruz.
  • sqlmetal /Map: c:\person.xml /code c:\person.dbml (dosya pathlerinin doğru yazdığınıza emin olunuz.)
  • Person.xml dosyasını projemize dahil ediyoruz.
  • Person.xml Properties -> Build Action “Content” olan seçeneği “Embedded Resource” yapınız
  • Datacontext çağıracağınız zaman aşağıda ki code bloğunu kullanınız.

 

public static LogoDbClassesDataContext GetDataContext(int Year)
{
	if ((Temp_Year != Year) || (Temp_source == null))
	{
		Temp_Year = Year;
		string FirmNo;
		ConnectionString = ConfigurationManager.ConnectionStrings["namespace.LOGOConnectionString"].ConnectionString;

		int tmp = GetLogoCompanyCode(Year); // yıla ait Firma kodunu bulun
		if (tmp != 0)
			FirmNo = tmp.ToString();
		else
			return null;


		Stream ioSt = Assembly.GetExecutingAssembly().GetManifestResourceStream("namespace.LogoDbXML.xml");
		XElement xe = XElement.Load(XmlReader.Create(ioSt));
		var tableElements = xe.Elements().AsQueryable().Where(e => e.Name.LocalName.Equals("Table"));
		foreach (var t in tableElements)
		{
			var nameAttribute = t.Attributes().Where(a => a.Name.LocalName.Equals("Name"));
			foreach (var a in nameAttribute)
			{
				if (a.Value.Equals("dbo.LG_999_INVOICE_01"))
					a.Value = a.Value.Replace("999", FirmNo);
			}
		}
		XmlMappingSource source = XmlMappingSource.FromXml(xe.ToString());
		Temp_source = source;
	}
	return new LogoDbClassesDataContext(ConnectionString, Temp_source);
}
LogoDbClassesDataContext tmp_Context = GetDataContext(Year)

 

Kaynak:
http://social.msdn.microsoft.com/Forums/en-US/f5e0af64-0057-4498-998b-70db656a0e9f/linq-to-sql-using-dynamic-tables

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir