相关疑难解决方法(0)

为什么.Contains慢?通过主键获取多个实体的最有效方法?

通过主键选择多个实体的最有效方法是什么?

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)

我意识到我可以做一些性能测试来比较,但我想知道是否实际上有比两者更好的方法,并且我正在寻找一些启示,这两个查询之间的区别是,如果有的话,一旦它们一直存在"翻译".

.net c# linq entity-framework entity-framework-4.1

57
推荐指数
1
解决办法
3万
查看次数

DbContext ChangeTracking杀死性能?

我正在将应用程序从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是我需要的.我必须能够最终坚持所有更改,而无需手工挑选修改了哪些实体.

我有什么想法可以解决这个性能问题?

performance change-tracking entity-framework-4.1

31
推荐指数
1
解决办法
3026
查看次数

在Entity Framework LINQ查询中使用IEnumerable.Contains时如何避免查询计划重新编译?

我使用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时避免重新编译?

linq performance linq-to-entities entity-framework

31
推荐指数
2
解决办法
3298
查看次数

SQL 到 IQueryable LINQ

您好,我正在尝试将以下 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)

c# sql linq asp.net-mvc

5
推荐指数
1
解决办法
1376
查看次数

优化慢速LINQ查询

我有一个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)

c# linq performance entity-framework

5
推荐指数
1
解决办法
4728
查看次数