2013-02-21 20 views
20

के बीच अंतर कैसे प्राप्त करें मेरे पास इन दो डेटाटेबल्स हैं और मैं उनके बीच अंतर प्राप्त करना चाहता हूं। यहाँ एक उदाहरण है:दो डेटाटेबल्स

Table1 
------------------------- 
ID | Name 
-------------------------- 
1 | A 
2 | B 
3 | C 
-------------------------- 

Table2 
------------------------- 
ID | Name 
-------------------------- 
1 | A 
2 | B 
-------------------------- 

मैं बस जो table1 में है और नहीं table2 में (table1-table2) डेटा के रूप में परिणाम चाहते

ResultTable 
------------------------- 
ID | Name 
-------------------------- 
3 | C 
-------------------------- 

मैं Linq के माध्यम से इन दो समान समाधान का उपयोग करने की कोशिश की, लेकिन यह हमेशा तालिका 1 लौटाता है और तालिका 1-तालिका 2 नहीं।

DataTable table1= ds.Tables["table1"]; 
DataTable table2= ds.Tables["table2"]; 
var diff= table1.AsEnumerable().Except(table2.AsEnumerable(),DataRowComparer.Default); 

दूसरा समाधान:

var dtOne = table1.AsEnumerable(); 
var dtTwo = table2.AsEnumerable(); 
var difference = dtOne.Except(dtTwo); 

तो, जहां गलती है यहाँ पहली समाधान है? आपके सभी उत्तरों के लिए बहुत बहुत धन्यवाद। :)

+2

चेक को गीला छोड़कर या नहीं, वे एक ही उदाहरण हैं। गीले नहीं हैं उनके संबंधित गुण समान हैं। आप अधिभार का उपयोग कर सकते हैं जो समानता कॉम्पैडर स्वीकार करता है या आप विभिन्न स्कीक + पुस्तकालयों में लागू किए गए एक्सटेंशन विधि ExceptBy() की जांच कर सकते हैं, जो कि जॉन स्कीट्स मोरलिंक (http://code.google.com/p/morelinq/) – Tormod

+2

@ टॉर्मोड, लेकिन फिर अपने पहले समाधान में 'DataRowComparer' का उपयोग क्या है? यह वास्तविक कॉलम मानों की तुलना करने के लिए 'सार्वजनिक बूल बराबर (ट्रो बाएंरो, ट्रो राइटरो) 'ओवरराइड करता है। – hometoast

+2

क्या आप दिखा सकते हैं कि आप अपने डेटाटेबल्स को कैसे पुनर्प्राप्त कर रहे हैं? क्या यह संभव है कि डेटा आपके अपेक्षा से अलग है? मैंने LINQPad में एक त्वरित नमूना किया और आपका पहला समाधान ठीक काम करता प्रतीत होता है। – goric

उत्तर

7

आप नीचे दिए गए कोड की कोशिश कर सकते हैं ...

table1.AsEnumerable().Where(
    r =>!table2.AsEnumerable().Select(x=>x["ID"]).ToList().Contains(r["ID"])).ToList(); 
1

मैं एक DataTable एक स्तंभ स्तर के बजाय पर यह करने के लिए कोशिश करेंगे।

IEnumerable<int> id_table1 = table1.AsEnumerable().Select(val=> (int)val["ID"]); 
IEnumerable<int> id_table2 = table2.AsEnumerable().Select(val=> (int)val["ID"]); 
IEnumerable<int> id_notinTable1= id_table2.Except(id_table1); 

बस अपने प्रश्न का उत्तर .Select() जोड़ने ...

0

नीचे दृष्टिकोण का प्रयास करें:

प्रारंभ:

var columnId = new DataColumn("ID", typeof (int)); 
var columnName = new DataColumn("Name", typeof (string)); 
var table1 = new DataTable(); 
table1.Columns.AddRange(new[] {columnId, columnName}); 
table1.PrimaryKey = new[] {columnId}; 
table1.Rows.Add(1, "A"); 
table1.Rows.Add(2, "B"); 
table1.Rows.Add(3, "C"); 

var table2 = table1.Clone(); 
table2.Rows.Add(1, "A"); 
table2.Rows.Add(2, "B"); 
table2.Rows.Add(4, "D"); 

समाधान:

var table3 = table1.Copy(); 
table3.AcceptChanges(); 
table3.Merge(table2); 

var distinctRows = from row in table3.AsEnumerable() 
        where row.RowState != DataRowState.Modified 
        select row; 

var distintTable = distinctRows.CopyToDataTable(); 

soluti से ऊपर टेबल 2 में नई पंक्तियां होने पर भी काम करता है जो तालिका 1 में मौजूद नहीं थे।

distintTable constains सी और डी

0

नीचे आज़माएं, यह बहुत बुनियादी है। एक साथ दो सेट मर्ज करें, और अंतर प्राप्त करें। अगर सेट ठीक से संरेखित नहीं होते हैं, तो यह काम नहीं करेगा।

DataSet firstDsData = new DataSet(); 
DataSet secondDsData = new DataSet(); 
DataSet finalDsData = new DataSet(); 
DataSet DifferenceDataSet = new DataSet(); 
finalDsData.Merge(firstDsData); 
finalDsData.AcceptChanges(); 
finalDsData.Merge(secondDsData); 
DifferenceDataSet = finalDsData.GetChanges(); 
5

मैं बस इसके माध्यम से चला गया और अपने निष्कर्ष साझा करना चाहता था। मेरे आवेदन के लिए यह एक डेटा सिंक तंत्र है, लेकिन मुझे लगता है कि आप देखेंगे कि यह मूल प्रश्न पर कैसे लागू होता है।

मेरे मामले में, मैं एक DataTable कि मेरे पिछले डेटा अपलोड का प्रतिनिधित्व किया और भविष्य में कभी, मैं डेटा की वर्तमान राज्य पाने के लिए और केवल मतभेद अपलोड करने की आवश्यकता थी।

// get the Current state of the data 
DataTable dtCurrent = GetCurrentData(); 

// get the Last uploaded data 
DataTable dtLast = GetLastUploadData(); 
dtLast.AcceptChanges(); 

// the table meant to hold only the differences 
DataTable dtChanges = null; 

// merge the Current DataTable into the Last DataTable, 
// with preserve changes set to TRUE 
dtLast.Merge(dtCurrent, true); 

// invoke GetChanges() with DataRowState.Unchanged 
// !! this is the key !! 
// the rows with RowState == DataRowState.Unchanged 
// are the differences between the 2 tables 
dtChanges = dtLast.GetChanges(DataRowState.Unchanged); 

मुझे उम्मीद है कि इससे मदद मिलती है।मैं कुछ घंटों के लिए इस के साथ लड़ा, और इंटरवेब्ज़ पर झूठी सुराग के बहुत सारे मिल गया है, और कुछ अलग अलग तरीकों से

+0

जब मैं यह सब कोशिश करता हूं तो मैं GetChanges से बाहर निकलता हूं, सेट का संघ नहीं है, अंतर नहीं। –

1

विलय के बाद RowStates की तुलना इस

DataTable dtmismatch = Table1.AsEnumerable().Except(Table2.AsEnumerable(), DataRowComparer.Default).CopyToDataTable<DataRow>(); 
1

प्रयास करें नीचे का प्रयास समाप्त हो गया, यह बहुत है बुनियादी। एक साथ दो सेट मर्ज करें, और अंतर प्राप्त करें। अगर सेट ठीक से संरेखित नहीं होते हैं, तो यह काम नहीं करेगा। उसी

DataSet firstDsData = new DataSet(); 
DataSet secondDsData = new DataSet(); 
DataSet finalDsData = new DataSet(); 
DataSet DifferenceDataSet = new DataSet(); 
finalDsData.Merge(firstDsData); 
finalDsData.AcceptChanges(); 
finalDsData.Merge(secondDsData); 
DifferenceDataSet = finalDsData.GetChanges();