【问题标题】:Best optimal LINQ with changing old dctionary to the new one [closed]将旧字典更改为新字典的最佳 LINQ [关闭]
【发布时间】:2020-04-08 18:17:02
【问题描述】:

我有一些脚本,它首先检查数据库中是否有一些值,然后根据这些值创建新集合。我不知道这个结果是否是我无法得到的最好结果,我认为没有。如果有人可以帮助我,我将不胜感激

var tempDict = request.Number_Name
            .Where(k => _context.Users.Where(x => x.Status == 0).Select(x => x.Phone).Contains(k.Key) || _context.Users.Where(x => x.Status == 0).Select(x => x.PhoneWithoutCC).Contains(k.Key))
            .ToDictionary(k => k.Key, v => v.Value);

            var finalDict = new Dictionary<string, string>();
            foreach (var kv in tempDict)
            {
                var number = _context.Users.Where(x => x.Status == 0).Where(x => kv.Key == x.PhoneWithoutCC || kv.Key == x.Phone).Select(x => new { x.Phone, x.DisplayName }).FirstOrDefault();
                if (!kv.Key.Contains("+"))
                {

                    finalDict[number.Phone] = number.DisplayName;
                }
                else
                {
                    finalDict[kv.Key] = number.DisplayName;
                }
            }

【问题讨论】:

  • 如果您使用延迟加载“_context.Users.Where(x => x.Status == 0)”,每次您尝试使用它时都会尝试连接数据库。
  • "finalDict[number.Phone] = number.DisplayName" 会引发空引用异常
  • 这段代码会有可怕的表现。您确实需要最少访问数据库的次数。

标签: c# linq optimization


【解决方案1】:

如果没有确切的对象模型和一些好的示例数据,我可以确定这是否正确,但它只会访问数据库一次。

让我知道这是否有效:

var phones = request.Number_Name.Select(x => x.Key).ToArray();

var query =
    _context
        .Users
        .Where(x => phones.Contains(x.Phone) || phones.Contains(x.PhoneWithoutCC))
        .Where(x => x.Status == 0)
        .Select(x => new { x.Phone, x.PhoneWithoutCC, x.DisplayName })
        .ToArray();

var finalDict =
(
    from q in query
    from p in new [] { q.Phone, q.PhoneWithoutCC }
    join n in request.Number_Name on p equals n.Key
    let k = n.Key.Contains("+") ? q.Phone : n.Key
    group q.DisplayName by k
)
    .ToDictionary(x => x.Key, x => x.First());

这也消除了对临时字典的需要。

【讨论】:

    【解决方案2】:

    我正在用手机打字,所以我无法检查它是否真的有效:)
    让我知道,我们会想出办法的。
    首先尝试从上下文角度思考,避免一遍又一遍地从 db 加载数据:

    var result = (from n in  request.Number_Name
                   join u in _context.Users 
                       on n.Key equals u.PhoneWithoutCC || n.Key equals u.Phone
                   where u.Status == 0
                   select new {
                                key = n.Key.Contains("+") ? n.Key : u.Phone,
                                DisplayName = u.DisplayName
                                })
                   .ToDictionary(k = k.Key, v = v.DisplayName);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多