由于数据库设计不佳,我必须编写一个复杂的查询来获取数据。
我需要从table_1获取所有有效数据。在其他作品中,我需要获取table_1的每个有效行。我的table_1中没有简单的有效或无效列。此信息存储在table_2中。 Table_2包含所有带有错误消息的无效行。
假设我需要检索的数据是订单。对于我的示例,请注意OrderNo是订单的编号。因此,我可以在table_1中拥有此订单的多行,版本,并且我在table_2中的此订单上也可能有多行错误。所以我还必须使用版本号。
我已经尝试过了:
{{1}}
我认为我需要做这样的事情:
{{1}}
你能帮帮我吗?
答案 0 :(得分: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));
答案 1 :(得分:1)
从表中获取数据但不在另一个表中获取
这称为antijoin。虽然您可以使用其他答案中提供的基于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
/ {{ 1}}构造。
答案 2 :(得分:0)
这个怎么样:
var validRows = table1
.Where(t1 => !table2
.Any(t2 => t1.OrderNo == t2.OrderNo &&
t1.Version == t2.Version));
请注意,除非您使用将表达式转换为SQL的精彩内容,否则在SQL中效率会高得多。