通过主键选择多个实体的最有效方法是什么?
public IEnumerable<Models.Image> GetImagesById(IEnumerable<int> ids)
{
//return ids.Select(id => Images.Find(id)); //is this cool?
return Images.Where( im => ids.Contains(im.Id)); //is this better, worse or the same?
//is there a (better) third way?
}
Run Code Online (Sandbox Code Playgroud)
我意识到我可以做一些性能测试来比较,但我想知道是否实际上有比两者更好的方法,并且我正在寻找一些启示,这两个查询之间的区别是,如果有的话,一旦它们一直存在"翻译".
我正在将应用程序从EF1升级到EF4.1我使用"ADO.NET DbContext Generator"模板创建了一个DbContext和一组POCO.
当我查询生成的DbContext时,查询的数据库部分需要4ms才能执行(使用EF Profiler验证).然后它将上下文大约40秒(用文字:FORTY!)在它将结果返回给应用程序之前做任何事情.
EF1在不到2秒的时间内处理相同的查询.
关闭AutoDetectChanges,LazyLoading和ProxyGeneration赢了2-3秒.
当我使用AsNoTracking()扩展方法时,我能够将总执行时间减少到大约3秒.
这表明ChangeTracking是罪魁祸首.
但ChangeTracking是我需要的.我必须能够最终坚持所有更改,而无需手工挑选修改了哪些实体.
我有什么想法可以解决这个性能问题?
我使用Entity Framework(v6.1.1)执行以下LINQ查询:
private IList<Customer> GetFullCustomers(IEnumerable<int> customersIds)
{
IQueryable<Customer> fullCustomerQuery = GetFullQuery();
return fullCustomerQuery.Where(c => customersIds.Contains(c.Id)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
这个查询被翻译成相当不错的SQL:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[FirstName] AS [FirstName]
-- ...
FROM [dbo].[Customer] AS [Extent1]
WHERE [Extent1].[Id] IN (1, 2, 3, 5)
Run Code Online (Sandbox Code Playgroud)
但是,我在查询编译阶段获得了非常显着的性能影响.呼叫:
ELinqQueryState.GetExecutionPlan(MergeOption? forMergeOption)
Run Code Online (Sandbox Code Playgroud)
占用每个请求约50%的时间.深入研究,结果是每次我传递不同的customersIds时都会重新编译查询.根据MSDN文章,这是一个正常现象,因为IEnumerable的是在查询中使用被认为是挥发性的,并且是缓存的SQL的一部分.这就是为什么SQL对于customersIds的每个不同组合都是不同的,并且它总是具有用于从缓存中获取编译查询的不同哈希.
现在问题是:如何在仍然查询多个customersIds时避免重新编译?
您好,我正在尝试将以下 SQL 语句转换为其等效的 LINQ 语句,并且由于我对 .net 真的很陌生(编码了一天),因此我已经被困在这个问题上好几个小时了。
SELECT *
FROM Books
WHERE BookID IN (SELECT BookID
FROM Borrows
WHERE UserID = 2)
Run Code Online (Sandbox Code Playgroud)
这是模型
public class LibUser
{
[Key]
public int UserID { get; set; }
[Required, StringLength(50), Display(Name = "First Name")]
public string UserFirstName { get; set; }
[Required, StringLength(50), Display(Name = "Last Name")]
public string UserLastName { get; set; }
[Required, StringLength(10000), Display(Name = "Residence"), DataType(DataType.MultilineText)]
public string Adress { get; set; }
}
public class Book {
[Key] …Run Code Online (Sandbox Code Playgroud) 我有一个LINQ查询,我在优化时遇到问题,大约需要5.5秒才能运行。我正在使用一个名为StaffingResourceData的视图和一个名为StaffingForecasts的表。
每个StaffingResource都有一个ResourceId,一个Division和一个Type。StaffingForecast具有ResourceId,项目,日期(代表一周中的星期一),小时。一个StaffingResource可以具有0个多个StaffingForecast。
对于每个StaffingResource,我都需要一个其未来12周的预计总工作时间的列表。这是我现在所拥有的:
// Get list of dates
var dates = new List<DateTime>();
var start = Utilities.GetStartOfWeek(DateTime.Today);
for (var i = 0; i < 12; i++)
{
dates.Add(start.AddDays(i * 7));
}
var end = dates[11];
// Get resources
var resources = (from r in context.StaffingResourceDatas
where r.EmployeeId != null
&& !exclusionList.Contains(r.ResourceTitleId)
join f in context.StaffingForecasts.Where(x => x.Date >= start && x.Date <= end) on r.ResourceId equals f.ResourceId into g1
from f in g1.DefaultIfEmpty()
group new { f.Date, f.Hours } by …Run Code Online (Sandbox Code Playgroud)