【问题标题】:How to write this T-SQL in LINQ to sQL?如何在 LINQ to SQL 中编写此 T-SQL?
【发布时间】:2010-12-23 10:37:14
【问题描述】:
select * from table1 where pkey1 in
(select pkey2 from table2 where column1='abc')

其中 pkey1 和 pkey2 都是 int 列。

【问题讨论】:

    标签: .net linq tsql linq-to-sql


    【解决方案1】:

    类似:

    from t1 in table1
    let x = from t2 in table2 where t2.column1.Equals("abc") select t2
    where t1.pkey1.Equals(x.pkey2)
    select t1;
    

    你最终知道let可以帮助你做什么:)

    【讨论】:

    • 当您尝试从x 调用pkey2 时可能会遇到一些问题,因为xIQueryable
    • 这正是我所做的!我想如果子查询只返回一个值,它会起作用,但是在我测试它的数据上,它返回了多个值并且 x 最终成为 IQueryable 并且甚至不会编译......尽管如此...... 跑去再试一次 ^_^
    • 嗯...我必须在一些奇怪的数据上对其进行测试,因为我仍然无法编译它。它一直将x 输入为IQueryable,但如果你看到它在你的盒子上运行,那对我来说已经足够了!
    【解决方案2】:

    不是 LINQ 答案,而是完全有效的 LINQ-to-SQL 答案:

    var results = ctx.ExecuteQuery<Table1>(@"
        select * from table1 where pkey1 in
        (select pkey2 from table2 where column1='abc')").ToList();
    

    您没有必须将每个查询的控制权交给 LINQ;实际上,在许多情况下,编写良好的自定义 TSQL 查询比从 LINQ-to-SQL 生成的查询要高效得多。这不是对 LINQ-to-SQL 的批评(它对于大多数简单的查询等都做得很好)。

    【讨论】:

    • 有没有像这样的简单技术来获取多个表?或者我们必须处理阅读器并使用reader.NextResult() 进行迭代是唯一的选择?
    • @balexandre - 差不多,但请注意,您可以使用 ctx.Translate&lt;TResult&gt;(DbDataReader) 让 LINQ 为您进行对象映射。
    • Marc,虽然您可以执行直接查询,但在删除列时确实会造成维护噩梦。更新所有这些查询可能会很痛苦。
    • 同意。在这种特殊情况下,我不会使用.ExecuteQuery - 这是一个相当简单的 LINQ 操作,L2SQL 应该可以毫无问题地转换为本机 SQL。但请记住你的观点。
    【解决方案3】:
    from t in table1
    join u in table2 on t.pkey1 equals u.pkey2
    where u.column1 == "abc"
    select t;
    

    【讨论】:

      【解决方案4】:
      var query = from a in db.table1
                  join b in db.table2 on a.pkey1 equals b.pkey2
                  where b.column1 == "abc"
                  select a;
      

      【讨论】:

      • 应该是 == 而不是 = ... 而且我们不应该总是使用 .Equals 而不是 == 吗?
      • 谢谢 - = 已更新。 w.r.t. .Equals,因为我们正在比较原始值(字符串、字符串),所以我将使用 ==。这里不用担心引用,这是.Equals的主要用途。
      • 虽然他没有要求,但我个人会使用不区分大小写的字符串比较。还有,不是"abc",不是'abc'吗?
      • @Merlyn Morgan-Graham - 是的,我也会使用不敏感的比较。这个问题有太多未知数 - 因此简单的答案。是的,感谢'' 的提及 - 认为我该睡觉了。 :)
      • 我认为你还需要一个 select 子句在那里的某个地方...... ^_^
      【解决方案5】:

      这是另一个可能的查询:

      var q = from t2 in table2.Where(x => x.column1 == "abc")
              from t in table1.Where(x => x.pkey1 == t2.pkey2)
              select t;
      

      您可能需要在结果上调用Distinct(),具体取决于您希望如何使用它。生成的SQL相当于:

      SELECT [t1].*
      FROM table2 AS [t2], table1 AS [t1]
      WHERE ([t2].[column1] = 'abc') AND ([t1].[pkey1] = [t2].[pkey2])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-24
        相关资源
        最近更新 更多