【问题标题】:C# LINQ value substitutionC# LINQ 值替换
【发布时间】:2021-04-26 22:01:50
【问题描述】:

我有两张表,布局如下

 username | displayname            username| FirstName | surname
 ---------|------------            -----------------------------
 foo        test                    foo    | andrew    | blah
 fa         display    

我要做的是在页面的左侧表格中显示所有displayname 条目。但是,如果右侧表中的 username 有匹配项,我希望将值 test 替换为 andrew

示例:

 username | displayname    
 ---------|------------      
 foo        andrew                    
 fa         display 

一切都是字符串。

下面是我对我需要的尝试,但我把它搞砸了,因为它将firstname 值应用于我的第一个表中的每个条目。

_users = UserService.GetAll().ToList();
_updates = UserUpdateService.GetAll().ToList();

foreach (var user in _users)
{
    foreach (var update in _updates)
        if (user.FirstName != "" && user.UserName == update.UserName)
        {
            update.DisplayName = user.FirstName;
        }
        else
        {
            update.DisplayName = user.UserName;
        }
}

有没有办法通过单个 LINQ 查询来做到这一点?

【问题讨论】:

  • 正如您从字面上提到的那样,LINQ 中的 Q 代表 query,而不是 modify。因此,您想要实现的目标是不可能的 - 或者只能通过肮脏的黑客来实现。
  • 您的代码在我看来相当不错。 LINQing 它不会给你带来任何好处,事实上它很可能会让你的代码更丑。
  • @HimBromBeere 问题是如果我在另一个表中有第二个条目并且“john”是名字值,那么“john”将应用于第一个表中的每个显示名称值
  • 这与是否使用 LINQ 无关,而是与您的业务逻辑有关。 LINQ 只是语法糖,它绝对不会向您的代码添加任何行为。所以如果你不能用经典循环来做,你也不能用 LINQ 做。
  • @HimBromBeere 你能告诉我实现我需要的正确逻辑吗?

标签: c# list linq .net-core entity-framework-core


【解决方案1】:

正如@HimBromBeere 的评论中提到的,我也同意 --- LINQ 只是语法糖,它绝对不会为您的代码添加任何行为。

要编写不同的写作风格,您可以使用下面的代码,它使用了很少的Linq 运算符

_users = UserService.GetAll().ToList();
_updates = UserUpdateService.GetAll().ToList();
_updates.ForEach(u => 
{
    var record == _users.FirstOrDefault(us => !string.IsNullOrEmpty(us.FirstName) && string.Equals(us.UserName, u.UserName));
    u.DisplayName = record != null ? record.FirstName : u.DisplayName;
});

【讨论】:

    【解决方案2】:

    这与您发布的不完全一样,因为我们将创建新实例而不是修改现有实例,但您可以执行以下查询:

    var table = _users
      .Select(user => new {
        user.UserName,
        DisplayName = _updates.Any(update => 
           user.FirstName != "" && user.UserName == update.UserName) 
        ?  user.FirstName 
        :  user.UserName 
      })
    );
    

    【讨论】:

      【解决方案3】:

      这是带有 LEFT JOIN 的有序 LINQ 查询,不要尝试使用列表来执行此操作。

      var users = UserService.GetAll();
      var updates = UserUpdateService.GetAll();
      
      var query = 
        from update in updates
        join user in users on user.UserName equals update.UserName into gj
        from user in gj.DefaultIfEmpty()
        select new 
        {
           update.UserName,
           DisplayName = !string.IsNullOrEmpty(user.FirstName) ? user.FirstName : update.DisplayName
        };
      
      var result = query.ToList();
      

      【讨论】:

      • 这不会更新任何内容,它会创建新的匿名对象。
      • @juharr。阅读 OP,他正在尝试显示数据,而不是更新。为什么你回退到对象,我不知道。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多