簡體   English   中英

LINQ從一個表中獲取數據,但如果不是在另一個表中?

[英]Linq to get data from a table but not if in another table?

由於我們數據庫的設計不佳,我不得不編寫一個復雜的查詢來獲取我的數據。

我需要從table_1獲取所有有效數據。 在其他工作中,我需要獲取table_1的每個有效行。 我的table_1中沒有簡單的有效或無效列。 該信息存儲在表_2中。 表_2包含所有無效行以及錯誤消息。

假設我需要檢索的數據是訂單。 對於我的示例,請注意,OrderNo是訂單號。 因此我可以在表_1中有此訂單的多行版本,並且在表_2中也可以有此訂單的多行錯誤。 因此,我還必須使用版本號。

我已經嘗試過了:

table_1.Where(y => (y.OrderNo == "1234"));
table_2.Where(y => (y.OrderNo == "1234")).Select(y => y.Version).Distinct();

我想我需要做這樣的事情:

var errorList = table_2.Where(y => (y.OrderNo == "1234")).Select(y => y.Version).Distinct();
table_1.Where(y => (y.OrderNo == "1234" && y.Version.NOT_IN(erriList)));

你可以幫幫我嗎?

我想您正在使用!搜索Contains函數! 符號( 邏輯取反運算符 )。 像這樣:

var errorList = table_2.Where(y => y.OrderNo == "1234")
                       .Select(y => y.Version);

var res = table_1.Where(y => y.OrderNo == "1234" 
            //here you get only rows that doesn't represent in errorList 
            && !errorList.Contains(y.Version)); 

從一個表中獲取數據,但如果在另一個表中則無法

這稱為反連接 雖然可以使用其他答案中Contains基於ContainsAny方法,但通常可以通過使用經典的SQL方法LEFT OUTER JOIN並結合在右側檢查NULL來獲得最佳性能。

在LINQ中看起來像這樣:

var query =
    from t1 in table_1
    //where t1.OrderNo == "1234"
    join t2 in table_2 on t1.OrderNo equals t2.OrderNo into t2group
    from t2 in t2group.DefaultIfEmpty()
    where t2 == null
    select t1;

實際上,當您使用OrderNo過濾器時,此查詢與其他查詢之間很可能不會出現明顯的速度差異。 上面的主要好處是,如果刪除該過濾器,盡管當今許多SQL查詢優化器都能夠導出一個相同的執行計划,而不管查詢是否使用JOIN / IN / EXISTS構造。

這個怎么樣:

var validRows = table1
                .Where(t1 => !table2
                              .Any(t2 => t1.OrderNo == t2.OrderNo && 
                                         t1.Version == t2.Version));

請注意,這在SQL中效率要高得多,除非您正在使用將表達式轉換為SQL的方法。

暫無
暫無

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

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