PDA

View Full Version : سوال: جوین کردن دو دیتاتیبل - datatable



barman.ar16
یک شنبه 19 فروردین 1397, 10:32 صبح
سلام و درود

دوستان من یک جدول دارم که درون دیتابیس آنلاین هست و یک جدول که در دیتابیس لوکال و آفلاین روی سیستم وجود داره
توی هر دو جدول یک ستون مشابه هست میخوام بر اساس اون ستون این دو تا جدول رو بهم وصل کنم و توی دیتاگرید ویو نمایش بدم (البته همه ستون های جدول آنلاین رو میخوام ولی بعضی از ستون های جدول آفلاین لازمم میشه)

توی اینجور موارد وقتی هر دو جدول توی یک دیتابیس و اون هم آفلاین بود من یک view درست می کردم و کار جوین رو توی دیتابیس انجام میدادم و بقیه ماجرا ... ولی الان گیج شدم
جستجو کردم متاسفانه مورد مناسبی پیدا نکردم

به نظرم باید اول هر دو اطلاعات رو برگردونم و هر کدوم رو بریزم توی دیتا تیبل بعد یک کوئری بزنم و این دو تا دیتاتیبل رو با هم جوین کنم درسته؟

ممنون میشم اگر کسی تکه کدی چیزی داره بگه بتونم ازش الگوبرداری کنم
متشکرم

رامین مرادی
یک شنبه 19 فروردین 1397, 10:47 صبح
سلام
کد زیر رو یه بار کامل مرور کنید.
میتونید با linq هر دو رو جوین کنید و ازش خروجی بگیرید.


var results = from table1 in dt1.AsEnumerable()
join table2 in dt2.AsEnumerable() on (int)table1["CustID"] equals (int)table2["CustID"]
select new
{
CustID = (int)table1["CustID"],
ColX = (int)table1["ColX"],
ColY = (int)table1["ColY"],
ColZ = (int)table2["ColZ"]
};
foreach (var item in results)
{
Console.WriteLine(String.Format("ID = {0}, ColX = {1}, ColY = {2}, ColZ = {3}", item.CustID, item.ColX, item.ColY, item.ColZ));
}

barman.ar16
دوشنبه 20 فروردین 1397, 23:57 عصر
سلام
کد زیر رو یه بار کامل مرور کنید.
میتونید با linq هر دو رو جوین کنید و ازش خروجی بگیرید.


var results = from table1 in dt1.AsEnumerable()
join table2 in dt2.AsEnumerable() on (int)table1["CustID"] equals (int)table2["CustID"]
select new
{
CustID = (int)table1["CustID"],
ColX = (int)table1["ColX"],
ColY = (int)table1["ColY"],
ColZ = (int)table2["ColZ"]
};
foreach (var item in results)
{
Console.WriteLine(String.Format("ID = {0}, ColX = {1}, ColY = {2}, ColZ = {3}", item.CustID, item.ColX, item.ColY, item.ColZ));
}



ممنون از جناب مرادی عزیز
با کمی تغییرات موفق شدم انجامش بدم در اسرع وقت کدش رو میگذارم

یه سوال دیگه من تفریق دو دیتاتیبل رو لازم دارم
خواستم تاپیک جدید بزنم پشیمون شدم گفتم ادامه همین تاپیک بنویسم

مثلا 100 تا رکورد توی دیتاتیبل اولم هست و 20 تا توی دیتاتیبل میخوام این 20 تا مشترک از 100 کم بشه و در نهایت یک دیتاتیبل نهایی داشته باشم با 80 تا رکورد

توی sql اینطوری کارم راه میفتاد ولی با دیتاتیبل نمیدونم باید چکار کنم

SELECT * FROM table1 WHERE id NOT IN(SELECT id FROM table2)

جستجو کردم ولی چیزی نیافتم

barman.ar16
سه شنبه 21 فروردین 1397, 19:36 عصر
دوستان و اساتید چیزی به ذهن شون نمی رسه
خودم این کد رو پیدا کردم ولی نمیدونم چرا کار نمی کنه


var rows =dtFirst.AsEnumerable().Except(dtSecond.AsEnumerab le(), DataRowComparer.Default);
DataTable result = null;
if (rows.Count() != 0)
result = rows.CopyToDataTable();

رامین مرادی
چهارشنبه 22 فروردین 1397, 12:27 عصر
این متد رو پیدا کردم.ورودیش دوتا دیتاتیبله با اسم ستون های کلید اصلی و خروجیش دیتا تیبله. اینو چک کنید


public DataTable myJoinMethod(DataTable LeftTable, DataTable RightTable,
String LeftPrimaryColumn, String RightPrimaryColumn)
{
//first create the datatable columns
DataSet mydataSet = new DataSet();
mydataSet.Tables.Add(" ");
DataTable myDataTable = mydataSet.Tables[0];


//add left table columns
DataColumn[] dcLeftTableColumns = new DataColumn[LeftTable.Columns.Count];
LeftTable.Columns.CopyTo(dcLeftTableColumns, 0);


foreach (DataColumn LeftTableColumn in dcLeftTableColumns)
{
if (!myDataTable.Columns.Contains(LeftTableColumn.ToS tring()))
myDataTable.Columns.Add(LeftTableColumn.ToString() );
}


//now add right table columns
DataColumn[] dcRightTableColumns = new DataColumn[RightTable.Columns.Count];
RightTable.Columns.CopyTo(dcRightTableColumns, 0);

foreach (DataColumn RightTableColumn in dcRightTableColumns)
{
if (!myDataTable.Columns.Contains(RightTableColumn.To String()))
{
if (RightTableColumn.ToString() != RightPrimaryColumn)
myDataTable.Columns.Add(RightTableColumn.ToString( ));
}
}

//add left-table data to mytable
foreach (DataRow LeftTableDataRows in LeftTable.Rows)
{
myDataTable.ImportRow(LeftTableDataRows);
}


ArrayList var = new ArrayList(); //this variable holds the id's which have joined


ArrayList LeftTableIDs = new ArrayList();
LeftTableIDs = this.DataSetToArrayList(0, LeftTable);


//import righttable which having not equal Id's with lefttable
foreach (DataRow rightTableDataRows in RightTable.Rows)
{
if (LeftTableIDs.Contains(rightTableDataRows[0]))
{
string wherecondition = "[" + myDataTable.Columns[0].ColumnName + "]='"
+ rightTableDataRows[0].ToString() + "'";
DataRow[] dr = myDataTable.Select(wherecondition);
int iIndex = myDataTable.Rows.IndexOf(dr[0]);


foreach (DataColumn dc in RightTable.Columns)
{
if (dc.Ordinal != 0)
myDataTable.Rows[iIndex][dc.ColumnName.ToString().Trim()] =
rightTableDataRows[dc.ColumnName.ToString().Trim()].ToString();
}
}
else
{
int count = myDataTable.Rows.Count;
DataRow row = myDataTable.NewRow();
row[0] = rightTableDataRows[0].ToString();
myDataTable.Rows.Add(row);
foreach (DataColumn dc in RightTable.Columns)
{
if (dc.Ordinal != 0)
myDataTable.Rows[count][dc.ColumnName.ToString().Trim()] =
rightTableDataRows[dc.ColumnName.ToString().Trim()].ToString();
}
}
}


return myDataTable;
}




منبع : https://www.codeproject.com/Articles/37444/Full-Outer-Join-of-Two-DataTables-C-Code