c# - 如何让 linq 准确地生成我想要的 sql?

标签 c# sql linq

我的第二天性是编写一些精心设计的 SQL 集处理代码来解决各种领域模型问题。然而,趋势是不再接触 SQL。 是否有一些模式引用或转换工具可以帮助将各种 SQL 模式转换为 Linq 语法?

我会查找编写代码的方法,例如以下代码:(这有一个子查询):

SELECT * FROM orders X WHERE
(SELECT COUNT(*) FROM orders Y
WHERE Y.totalOrder > X.totalOrder) < 6

(抓取带副作用的总订单数前五名)

或者,您如何知道 Linq 在不使用调试器的情况下作为单个语句执行?我知道您需要遵循枚举,但我假设只是在某处查找模式。

这是来自 MSDN 站点的,这是他们执行 SQL 差异的示例。我可能是错的,但我认为这不会在服务器上使用集合处理(我认为它在本地提取两个集合然后取差,这将是非常低效的)。我可能错了,这可能是该引用资料中的模式之一。

SQL 差异示例:

var differenceQuery =
(from cust in db.Customers
select cust.Country)
.Except
    (from emp in db.Employees
    select emp.Country);

谢谢

-- 更新:

-- Microsoft's 101 Linq Samples in C#是在模式中构建 linq 以生成所需 SQL 的更接近方法。当我找到它们时,我会发布更多。我真的在寻找一种将 SQL 转换为 Linq 的方法(模式或转换工具)。

-- 更新(微软在Linq中差异模式的sql):

SELECT DISTINCT [t0].[field] AS [Field_Name]
FROM [left_table] AS [t0]
WHERE NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM [right_table] AS [t1]
WHERE [t0].[field] = [t1].[field]
))

这就是我们想要的,而不是我所期望的。所以,这是一种需要记住的模式。

最佳答案

如果你有手写的SQL,你可以使用ExecuteQuery,将“行”类的类型指定为函数模板参数:

var myList = DataContext.ExecuteQuery<MyRow>(
    "select * from myview");

“行”类将列公开为公共(public)属性。例如:

public class MyRow {
    public int Id { get; set; }
    public string Name { get; set; }
    ....
}

您可以用更多信息装饰列:

public class MyRow {
    ....
    [Column(Storage="NameColumn", DbType="VarChar(50)")]
    public string Name { get; set; }
    ....
}

根据我的经验,linq to sql 不会生成非常好的 SQL 代码,而且它生成的代码对于大型数据库来说会崩溃。 linq to sql 做得很好的是向您的客户端公开存储过程。例如:

var result = DataContext.MyProcedure(a,b,c);

这允许您将 SQL 存储在数据库中,同时具有易于使用、自动生成的 .NET 包装器的优势。

要查看正在使用的确切 SQL,您可以使用 SQL Server Profiler 工具:

http://msdn.microsoft.com/en-us/library/ms187929.aspx

Linq-to-Sql 调试可视化工具:

http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx

或者您可以编写自定义代码来记录查询:

http://goneale.wordpress.com/2008/12/31/log-linq-2-sql-query-execution-to-consoledebug-window/

关于c# - 如何让 linq 准确地生成我想要的 sql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792094/

相关文章:

c# - 基于 C# 套接字的 HTTP

mysql - 连接三个表以便可以替换多个列值

c# - 使用 linq 查询填充列表框 - 值未设置

c# - MFC 编程中的\$InstallDir\VC\atlmfc\src\mfc\olelock.cpp 第 62 行调试断言失败

c# - MonoTouch,MonoTouch 的 future 以及我是否应该将它用于 iPhone 应用程序(而不是 objective-C)

c# - NLog 找不到或加载配置文件

c# - 如何使用可选列进行选择?

php - 对用户消息 SQL 进行排序

C# 如何使用 .OrderBy 处理多列并将列号解码为列名?

c# - 当 a 和 b 具有相同的结构时,List<a> 到 List<b> 转换?