簡體   English   中英

與LINQ C#中的多個Where子句比較

[英]Comparison with multiple Where clause in LINQ C#

我有兩個數據表:

DataTable dtCatalogFromMySql;
DataTable dtDataForExistingProducts;

dtCatalogFromMySql

Id | productname  | barcode  | pricesell| type  
---+--------------+----------+----------+------
1  | Abz          | 123      | 2.01     | RS // different product name
2  | Abd          | 122      | 8.90     | RS // different price
3  | Abx          | 125      | 21.00    | WS  // both different
4  | Abf          | 124      | 2.11     | RS
5  | Abg          | 126      | 8.01     | WS 
6  | Abh          | 127      | 60.23    | RS
7  | Abi          | 128      | 9.10     | RS

dtDataForExistingProducts

Id | productname  | barcode  | pricesell| type  
---+--------------+----------+----------+------
1  | Abc          | 123      | 2.01     | RS
2  | Abd          | 122      | 3.90     | RS
3  | Abe          | 125      | 23.00    | WS 
4  | Abf          | 124      | 2.11     | RS
5  | Abg          | 126      | 8.01     | WS 
6  | Abh          | 127      | 60.23    | RS
7  | Abi          | 128      | 9.10     | RS

我只需要返回與第一個表不同的行

我需要選擇Prod_No 等於 baracodeDescript 不等於 productnameRetail_PRC 也不等於 pricesell所有數據。

我沒有得到此代碼的結果

List<DataRow> matchingRows = dtCatalogFromMySql.AsEnumerable()
    .Where(a => dtDataForExistingProducts.AsEnumerable()
        .Select(b => b.Field<string>("Prod_No"))  
        .Contains(a.Field<string>("barcode")))
    .Where(a => !dtDataForExistingProducts.AsEnumerable()
        .Select(b => b.Field<string>("Descript"))
        .Equals(a.Field<string>("productname")))
    .Where(a => !dtDataForExistingProducts.AsEnumerable()
        .Select(b => b.Field<decimal>("Retail_PRC"))
        .Equals(Convert.ToDecimal(a.Field<double>("pricesell"))))
    .ToList();

我想,如果barcode = 123456Prod_No = 1234Contains()也將獲取數據,對嗎? 如果我是對的,那么比較字符串完全相同的正確方法是什么

您可能需要考慮更清晰的語法,例如:

var results = from t1 in dtCatalogFromMySql.AsEnumerable()
              join t2 in dtDataForExistingProducts.AsEnumerable() on 
                  (string)t1["barcode"] equals (string)t2["Prod_No"]
              where (string)t1["productname"] != (string)t2["descript"] &&
                    Convert.ToDecimal((double)t1["pricesell"]) != 
                    (decimal)t2["Retail_PRC"]
              select t2;

加入絕對是必經之路。 您可以根據所需的結果集修改選擇。

trighati很好地說明了使用OR代替AND 這是假設您要在Prod_no和條形碼相等的情況下,至少要更改一個值的所有數據。 這會將查詢更改為:

var results = from t1 in dtCatalogFromMySql.AsEnumerable()
              join t2 in dtDataForExistingProducts.AsEnumerable() on
                  (string)t1["barcode"] equals (string)t2["Prod_No"]
              where (string)t1["productname"] != (string)t2["descript"] ||
                    Convert.ToDecimal((double)t1["pricesell"]) != 
                    (decimal)t2["Retail_PRC"]
              select t2;

使用Join將它們組合成一個結果集,然后過濾結果集:

var combined = dtDataForExistingProducts.AsEnumerable()
    .Join(dtCatalogFromMySql.AsEnumerable(), 
        ep => ep.Field<string>("Prod_No")
        ce => ce.Field<string>("barcode"), 
        (ep, ce) => new {ExistingProduct = ep, CatalogEntry = ce})
    .Where(m => !m.ExistingProduct.Field("Descript")
        .Equals(m.CatalogEntry.Field("productname")))
    .Where(m => decimal.Parse(m.ExistingProduct.Field("Retail_PRC").ToString()) 
        != decimal.Parse(m.CatalogEntry.Field("pricesell").ToString()))
    .ToList()
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM