[英]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
基於Contains
和Any
方法,但通常可以通過使用經典的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.