微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何让linq生成我想要的sql?

对我来说,提出一些精心设计的sql集处理代码解决各种领域模型问题是第二天性.但是,趋势是不再触摸sql.是否有一些模式引用或转换工具可以帮助将各种sql模式转换为 Linq语法?

我会查找代码如下代码方法:(这有一个查询):

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

(以副作用获得前五名最高订单总数)

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

这是来自MSDN站点,这是他们做sql差异的例子.我可能错了,但我不认为这会在服务器上使用set处理(我认为它会在本地拉出两个集合然后取得差异,这将是非常低效的).我可能错了,这可能是该引用的模式之一.

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.

– 更新(来自Microsoft在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,将“row”类的类型指定为函数模板参数:
var myList = DataContext.ExecuteQuery<MyRow>(
    "select * from myview");

“row”类将列公开为公共属性.例如:

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 Debug Visualizer:

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/

原文地址:https://www.jb51.cc/csharp/98696.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐