我的sql查询需要等效的linq查询

时间:2018-01-19 06:49:59

标签: sql entity-framework linq

SELECT * FROM Tbl_Vulpith_Registration
WHERE MemId NOT IN (select MemId from Tbl_PublicLink);

2 个答案:

答案 0 :(得分:0)

请尝试以下代码段:

var query = from c in dc.Tbl_Vulpith_Registration
            where !(from o in dc.Tbl_PublicLink
                    select o.MemId )    
                   .Contains(c.MemId )    
            select c;

或使用扩展方法:

var resultList= Tbl_Vulpith_Registration.Where(p => !Tbl_PublicLink.Any(p2 => p2.MemId == p.MemId));

答案 1 :(得分:0)

将SQL转换为LINQ查询理解:

  1. 将FROM子选项转换为单独声明的变量。
  2. 以LINQ子句顺序翻译每个子句,将monadic运算符(DISTINCT,TOP等)转换为应用于整个LINQ查询的函数。
  3. 使用表别名作为范围变量。使用列别名作为匿名类型字段名称。
  4. 对多列使用匿名类型(new {})
  5. 使用into join_variable模拟左连接,然后从连接变量后跟.DefaultIfEmpty()进行另一次连接。
  6. 将COALESCE替换为条件运算符和空值测试。
  7. IN翻译为.Contains(),将NOT IN翻译为!...Contains()
  8. SELECT *必须替换为select range_variable或者连接,一个包含所有范围变量的匿名对象。
  9. SELECT字段必须替换为select new {...},创建一个包含所有所需字段或表达式的匿名对象。
  10. 必须使用扩展方法处理正确的外部联接。
  11. 因此您的SQL查询转换为:

    var ExcludeMemIds = from pl in Tbl_PublicLink select pl.MemId;
    var ans = from vr in Tbl_Vulpith_Registration
              where !ExcludeMemIds.Contains(vr.MemId)
              select vr;