在表中获取Missing Rows并将它们复制到另一个表中

时间:2015-03-16 10:52:03

标签: c# linq

var FileProducts = from ProductsRow in ProductRangesDt.AsEnumerable()
                                 join Filee in FileTb.AsEnumerable() on ProductsRow["GEN_CODE"].ToString() equals Filee["GEN_CODE"].ToString()
                                 select new
                                 {
                                     PRODUCT_ID = ProductsRow["PRODUCT_ID"],
                                     PRODUCT_NAME = ProductsRow["PRODUCT_NAME"],
                                     PROVIDER_ID = ProductsRow["PROVIDER_ID"],
                                     PROVIDER_NAME = ProductsRow["PROVIDER_NAME"],
                                     GEN_CODE = ProductsRow["GEN_CODE"],
                                     MIN_QUANTITY = Filee["MIN_QUANTITY"],
                                     MAX_QUANTITY = Filee["MAX_QUANTITY"],
                                     DISCOUNT_VALUE = Filee["DISCOUNT_VALUE"]
                                 };
var s = (from b in FileProducts
                        select  b.PRODUCT_ID).Distinct(); // count=285
var Products = (from ProductsRow in ProductRangesDt.AsEnumerable()
                                select ProductsRow["PRODUCT_ID"]).Distinct(); // count=7159

var result = Products.Except(s); // it's count should be 7159-285

我希望得到products ID中的所有ProductsFileProducts中不存在我怎么能这样做? result始终将0作为计数

返回

1 个答案:

答案 0 :(得分:1)

MSDN documentation关于Except扩展方法:

  

此方法通过使用延迟执行来实现。眼前的   返回值是存储所有信息的对象   需要执行操作。此方法表示的查询   在通过调用对象枚举对象之前不会执行   直接使用GetEnumerator方法或在Visual C#或For中使用foreach   每个都在Visual Basic中。

因此,为了从Set区分中获得真正的价值,您需要通过使用foreach(result.Count())调用Count() - 方法(foreach (var r in result) { ... })来枚举结果。

我无法使用您的数据进行测试,但是根据我的处置测试数据,Except-extension确实提供了正确的结果。