【问题标题】:Linq with join - Get single resultLinq with join - 获取单个结果
【发布时间】:2021-06-22 18:14:31
【问题描述】:

我遇到了一个 linq 查询,需要一点帮助。

我有以下表格

表:客户端

ClientId     Name           Age
(integer)
--------    ----------    -----
  12635      John          23
  87263      Derek         43
  65237      Sarah         36
  84735      Alice         28

表格:操作

Id          Action      ObjecId 
                        (varchar)
--------    ---------   ---------
  202        Firefox       87263
  203        Chrome        65237
  204        Android       87263
  205        Explorer      84735 
  206        Firefox       12635

我的目标是使用ClientIdObjectId 字段连接两个表。对于每个用户的操作表,我只需要获取一条记录。如果用户有两条记录,我只需要获取 value='Android' 的一条

所以上面数据的结果应该是:

Derek      Android 
Sarah      Chrome
Alicie     Explorer
John       Firefox

我正在使用以下方法。

var query = Set as IQueryable<Client>;

var actionQuery = Set as IQueryable<Action>

query= query.Join(actionQuery, 
                  Client=> Client.ClientId.ToString(),
                  Action => Action.ObjectId.ToString(),
                  (Client, Action) => Client);

上面我有 Derek 的重复记录,我只需要为他获取一个记录,但我不知道该怎么做。如果用户有 2 条记录,我只需要获取 value='Android' 的一条。

拜托,你能帮帮我吗? 谢谢

【问题讨论】:

  • 愚蠢的问题 - 如果一个特定的客户端有两条记录,但它们都不是“Android”怎么办?说真的 - 为什么不按 ClientId 对结果进行分组,并在每个组中选择具有最高 Action Id 的记录?我相信这就是您要找的。​​span>
  • 如果一个特定客户端有两条记录但没有一条是“Android”,该怎么办? -> 这种情况是不可能的。如果客户有两条记录,其中一条总是 Android。您的查询无效,因为我无法按 actionId 排序,如果 Android 操作记录的 id 较低,则此查询不会得到我想要的结果

标签: linq


【解决方案1】:

如果您只需要 ActionId 最高的记录,我会执行以下操作:

query = query.Join(actionQuery, 
                   Client=> Client.ClientId.ToString(),
                   Action => Action.ObjectId.ToString(),
                   (Client, Action) => new { Client = Client, Action = Action })
             .GroupBy(g => g.Client.Id)
             .Select(g => g.OrderByDescending(gr => gr.Action.Id).First());

编辑: 在 OP 指定如果特定客户端有更多操作,其中之一是 always“Android”并且必须选择这个之后,我提供以下查询:

query = query.Join(actions,
                   Client => Client.Id.ToString(),
                   Action => Action.ObjectId.ToString(),
                   (Client, Action) => new { Client = Client, Action = Action })
             .GroupBy(g => g.Client.Id)
             .Select(g => (g.Count() > 1) ? g.Where(gr => "Android".Equals(gr.Action.ActionDesc)).First() : g.First());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多