【问题标题】:linq join causing very slow performance / correct way to optimize itlinq join 导致性能非常慢/优化它的正确方法
【发布时间】:2015-03-11 09:43:15
【问题描述】:

我已经加入 linq 如下

IEnumerable < UserATrailViewModel > v1 = from u in useratrailbusiness.GetAllUsers().AsQueryable()
join u1 in userPackageAtrailBusiness.GetAllUsers().AsQueryable()
on u.Uid equals u1.Uid into t1
from subpet in t1.DefaultIfEmpty()
orderby u.CreatedDate descending

select new UserATrailViewModel {

    UserATID = u.UserATID,
    Uid = u.Uid,
    RoleId = u.RoleId,

    FirstName = Md5Decryption.Decrypt(u.FirstName),
    LastName = Md5Decryption.Decrypt(u.LastName),
    Email = u.Email,
    UserName = u.UserName,
    CreatedDate = u.CreatedDate,
    IsActive = u.IsActive,
    CreatedBy = u.CreatedBy,
    ModifiedDate = u.ModifiedDate,
    ModifiedBy = u.ModifiedBy,
    //UniqueGuid = u.UniqueGuid,
    CompanyName = Md5Decryption.Decrypt(u.CompanyName),
    Country = Md5Decryption.Decrypt(u.Country),

    State = Md5Decryption.Decrypt(u.State),
    City = Md5Decryption.Decrypt(u.City),

    Address1 = Md5Decryption.Decrypt(u.Address1),
    Address2 = Md5Decryption.Decrypt(u.Address2),
    PhoneNo = Md5Decryption.Decrypt(u.PhoneNo),
    MobileNo = Md5Decryption.Decrypt(u.MobileNo),
    SrvDTStamp = u.SrvDTStamp,
    ClientCountry = u.ClientCountry,
    App_User = u.App_User,
    Audit_Action = u.Audit_Action,
    FullName = Md5Decryption.Decrypt(u.FirstName) + " " + Md5Decryption.Decrypt(u.LastName),
    ContactNo = Md5Decryption.Decrypt(u.PhoneNo) + " , " + Md5Decryption.Decrypt(u.MobileNo),

    PackageName = (subpet == null ? String.Empty : subpet.PackageName),
};

它非常慢,因为即使是 40 到 50 条记录也需要 18 到 24 秒才能获取数据。我怎样才能让它更快,因为它非常慢。我不确定获取这些数据是否是正确的方法。所以任何其他替代方法也很受欢迎,它可以使过程更快。

【问题讨论】:

  • 如果您对数据库进行概要分析,正在生成什么 SQL?当您运行该 SQL 时,执行计划是什么样的?这里的问题更有可能与您的数据库有关,而不是与您的代码有关
  • @Jamiec 不,他的代码在查看 select 语句时遇到问题,尤其是 Md5Decryption.Decrypt(u.FirstName),我相信这是 linq to sql 永远不可能实现的。
  • @Jamiec 同意,但可能也与解密很多字段有关
  • 哇,我什至没有注意到! Md5 解密。我知道它的哈希值很弱,但这似乎……有点……疯了。
  • useratrailbusiness.GetAllUsers().AsQueryable() 获取内存中的所有表。您不是在 linq to entity 范式中,而是在 linq to object 中。尝试重写 linq to entity 的查询并对查询结果进行处理(如解密)。

标签: c# performance linq entity-framework linq-to-sql


【解决方案1】:

您可以首先将所有对Md5Decryption.Decrypt() 方法的调用移至UserATrailViewModel 类,无论是在构造函数中还是在自定义设置器中。这将使您的查询更加简单,因为您并不真的希望数据库进行解密。

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 2015-01-15
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多