string id = (from c in context.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();
1)我如何使用Linq编译的查询来提高上面的性能。我们被限制只能使用.NET 3.5。
2)对于上述代码,使用编译后的linq查询在百分比方面会有什么性能提升?
发布于 2012-08-30 01:06:27
您可以通过以下方式创建编译后的查询:
Func<YourContextType, int, string> query = CompiledQuery.Compile(
(YourContextType context, int id) =>
context.Users.Where(u => u.u_id == id).Select(u => u.u_id)
.SingleOrDefault()
);
然后,您可以将其用作:
string resultId = query(context, Id);
至于性能提升,这可能很重要,但也可能微乎其微。这实际上取决于执行查询的速度,以及重用编译后的查询的频率。在许多情况下,使用cmopiled查询实际上会更慢,因为编译的开销并不能弥补速度的提高。您需要进行测量,以确定这是否值得付出努力。
请注意,如果您知道自己只有一个惟一的ID,那么只需使用FirstOrDefault()
而不是SingleOrDefault()
,也可以提高原始查询的速度。
发布于 2012-08-30 01:05:52
像这样声明编译后的查询:
static readonly Func<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE> compiledQuery =
CompiledQuery.Compile<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE>(
(ctx, Id) => (from c in ctx.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();
然后在您的代码中调用已编译的查询:
RETURN_VALUE_TYPE results = compiledQuery.Invoke(context, Id);
至于性能的提高,这可能取决于几个因素,但是请记住,在LINQ查询执行的范围内,查询编译是该过程中代价高昂的一部分。无论何时将LINQ查询逻辑添加到基于LINQ to SQL或Entity Framework的应用程序中,都应该考虑预编译查询并重用它们。
发布于 2012-08-30 01:20:25
一个厚颜无耻的选择是:不要让LINQ参与这样一个琐碎但对性能至关重要的操作。例如,使用dapper-dot-net:
string id = connection.Query<string>(
@"select u_id from Users where u_id = @id",
new { id = Id }).SingleOrDefault();
这完全避免了所有的LINQ抽象,直接依赖于数据库(完全无参数等)。
https://stackoverflow.com/questions/12182926
复制相似问题