【发布时间】:2010-10-24 05:35:40
【问题描述】:
我在搞乱 LinqToSQL 和 LINQPad,我注意到 SingleOrDefault() 不会在生成的 SQL 中进行任何过滤或限制(我几乎预计相当于 Take(1))。
所以假设您想保护自己免受意外退货的影响,那么以下 sn-p 是否有用还是一个坏主意?
// SingleType is my LinqToSQL generated type
// Singles is the table that contains many SingleType's
// context is my datacontext
public SingleType getSingle(int id)
{
var query = from s in context.Singles where s.ID == id select s;
var result = query.Take(2).SingleOrDefault();
return result;
}
与通常的方式相反,我会这样做(注意没有 .Take(2) )
public SingleType getSingle(int id)
{
var query = from s in Singles where s.ID == id select s;
var result = query.SingleOrDefault();
return result;
}
我认为使用 Take(2),我仍然可以获得 SingleOrDefault() 的功能,另外还有一个好处是永远不必担心意外返回 {n} 行,但我不确定它是否值得除非我一直期望在我的查询中意外返回 {n} 行。
那么,这值得吗?它有害吗?有没有我没有看到的优点/缺点?
编辑:
不带 Take(2) 的 SQL 生成
SELECT [t0].[blah], (...)
FROM [dbo].[Single] AS [t0]
WHERE [t0].[ID] = @p0
使用 Take(2) 生成的 SQL
SELECT TOP 2 [t0].[blah], (...)
FROM [dbo].[Single] AS [t0]
WHERE [t0].[ID] = @p0
另外,当我谈到 SingleOrDefault 的功能时,我特别希望在返回 2 个或更多时让它抛出异常,这就是我正在执行“Take(2)”的原因。不同之处在于,如果没有 .Take(2),它将从数据库返回 {n} 行,而实际上它只需要返回 2(足以让它抛出)。
【问题讨论】:
-
你看过生成的SQL了吗?我从未验证过,但我认为 SingleOrDefault 会获得 TOP 1。
-
当列上没有唯一约束时,TOP 1 不足以确定最多有一行。所以它必须是 TOP 2 或者如果该列具有唯一约束,则可以省略。
标签: c# sql linq-to-sql optimization