Linq从表中获取数据但不在另一个表中获取数据?

时间:2016-05-11 06:30:22

标签: c# linq

由于数据库设计不佳,我必须编写一个复杂的查询来获取数据。

我需要从table_1获取所有有效数据。在其他作品中,我需要获取table_1的每个有效行。我的table_1中没有简单的有效或无效列。此信息存储在table_2中。 Table_2包含所有带有错误消息的无效行。

假设我需要检索的数据是订单。对于我的示例,请注意OrderNo是订单的编号。因此,我可以在table_1中拥有此订单的多行,版本,并且我在table_2中的此订单上也可能有多行错误。所以我还必须使用版本号。

我已经尝试过了:

{{1}}

我认为我需要做这样的事情:

{{1}}

你能帮帮我吗?

3 个答案:

答案 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。虽然您可以使用其他答案中提供的基于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 / {{ 1}}构造。

答案 2 :(得分:0)

这个怎么样:

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

请注意,除非您使用将表达式转换为SQL的精彩内容,否则在SQL中效率会高得多。