2016-05-11 74 views
0

由於我們的數據庫設計不佳,我必須編寫一個複雜的查詢來獲取我的數據。Linq從表中獲取數據,但如果在另一個表中則沒有?

我需要從table_1獲取所有有效數據。在其他作品中,我需要獲取我的table_1的每個有效行。我的table_1中沒有簡單的有效或無效列。這些信息存儲在table_2中。表2包含具有錯誤消息的所有無效行。

假設我需要檢索的數據是訂單。對於我的示例,請注意OrderNo是訂單的編號。所以我可以在table_1中有多個行,版本的這個訂單,而且我也可以在table_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))); 

你能幫助我嗎?

+0

聽起來很正常,不錯設計 – Mick

+0

在table1和table2之間是否有外鍵? –

+0

你可以通過連接來完成。左外連接進行連接,幷包括不在A an中的項目在B中。請參閱網頁:https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

回答

1

我想你正在尋找Contains功能與!符號(logical negation operator)。就像這樣:

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)); 
+0

你不需要Distinct(),我認爲沒有它,查詢會更快。 – Mick

+0

@Mick同意,但是Distinct()在OP示例中。所以瑪比有一些我們不知道的東西 –

+0

不,你可能有權利。我不需要獨特的。 –

0

如何:

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

注意,這是迄今爲止在SQL更有效,除非你正在使用的東西看中的是翻譯的表達,SQL。

+1

你是什麼意思,在SQL中更高效?所有的linq查詢都將被轉換爲SQL,對吧? –

+0

@ B413 - 通常,只要數據源連接到數據庫,它就會。但是我們並不真正瞭解table1.GetType(),而沒有更多的源代碼。我們只知道它是IEnumerable 。 – hoodaticus

1

從表中獲取數據,但不能如果另一個表

這就是所謂的antijoin。雖然您可以使用基於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結構。

+0

我認爲在3個答案中,這將是最高效的,根據我的經驗,聯接比子查詢快 – Mick

相關問題