【发布时间】:2013-07-31 19:24:53
【问题描述】:
我正在使用 LINQ To Sql(不是实体框架)、System.Data.Linq.DataContext 库、访问 SQL Server 2005 数据库并使用 .Net Framework 4。
表 dbo.Dogs 有一个 CHAR(1) NULL 类型的“Active”列。如果我直接编写 SQL,查询将是:
SELECT * FROM dbo.Dogs where Active = 'A';
LINQ 查询是这样的:
from d in myDataContext.Dogs where d.Active == 'A' select d;
从上述 LINQ 查询生成的 SQL 将 Active 字段转换为 UNICODE。这意味着我无法使用 dbo.Dogs.Active 列上的索引,从而显着降低查询速度:
SELECT [t0].Name, [t0].Active
FROM [dbo].[Dog] AS [t0]
WHERE UNICODE([t0].[Active]) = @p1
我能做些什么来阻止 Linq to Sql 插入 UNICODE() 调用(从而失去我对 dogs.Active 的索引的好处)?我尝试使用 EntityFunctions.AsNonUnicode() 方法包装参数,但这没有用(它在生成的 sql 中将 CONVERT() 插入到 NVARCHAR 而不是 UNICODE() ),例如:
...where d.Active.ToString() == EntityFunctions.AsNonUnicode('A'.ToString());
【问题讨论】:
-
这是我个人的看法,但它是基于我自己的经验——不要使用 Linq2SQL 它会产生可怕的 SQL 语句,而且你的 Linq 查询增长得越复杂——发出的最优 SQL 语句就越少.不确定其他 ORM,但这个是邪恶的。
-
是的。我应该补充一点,我没有使用 Linq to Sql,因为我比较了不同的 ORM 并决定 Linq to Sql 是最好的。我正在维护旧代码。
-
虽然 ORM 是非常容易泄漏的抽象,但我不同意永远不要使用它们的跨板声明。该决定很大程度上取决于用例。那里有明显的价值,也有明显的缺点。
-
好吧,如果你根本不关心性能,我猜 ORM 没问题。
-
和内存一样,数据库也是共享资源。每个错误的查询本身都不是问题。但如果作为一个整体,你将面临千刀万剐的死亡。
标签: c# .net linq-to-sql