有关重复C#EF的更新字段IEnumerable

时间:2018-07-16 04:54:06

标签: c# linq

我有以下查询:

sqlQuery = 'SELECT MPID, MAPPOINT, X, Y, MPCODE, MultipleSite = 0 FROM MAPPOINT'
 var data = context.Database.SqlQuery<WayPoint>(sqlQuery).ToList();

我在下面粘贴了结果。

如果其他行具有相同的MultipleSiteX值,我想更新此结果并将Y列设置为1。

例如:记录2和3具有相同的XY值,所以我想将其列MultipleSite的值更新为1。 我是否必须迭代结果并进行一些比较,或者可以通过其他任何方式进行?

这个想法是要有一个标志,告诉我在该坐标中还有其他站点。

我的课看起来像这样:

public class WayPoint
{
  public int MPID { get; set; }
  public string MAPPOINT { get; set; }
  public double X { get; set; }
  public double Y { get; set; }
  public string MPCODE { get; set; }
  public bool MultipleSite { get; set; }
}

enter image description here

3 个答案:

答案 0 :(得分:1)

鉴于您的数据模型(即WayPoint),请尝试以下操作:

             data.GroupBy(o => new { X = o.X, Y = o.Y })
                .Select(g => new
                {
                    Items = g.Select(gp => new WayPoint
                        {
                            MPID = gp.MPID,
                            MAPPOINT = gp.MAPPOINT,
                            X = g.Key.X,
                            Y = g.Key.Y,
                            MPCODE = gp.MPCODE,
                            MultipleSite = g.Count() > 1
                        })
                }
              )
              .SelectMany(g=>g.Items)
              .ToList();

答案 1 :(得分:1)

这可以在一个SQL命令中完成...

UPDATE MAPPOINT 
SET [MultipleSite] = 1
FROM MAPPOINT m
INNER JOIN (
    SELECT X, Y FROM MAPPOINT
    GROUP BY X, Y
    HAVING COUNT(*) > 1
) gr on gr.X = m.X 
and gr.Y = m.Y

如果您只想选择这些记录以在内存中进行操作...

SELECT m.* 
FROM MAPPOINT m
INNER JOIN (
    SELECT X, Y FROM MAPPOINT
    GROUP BY X, Y
    HAVING COUNT(*) > 1
) gr on gr.X = m.X 
and gr.Y = m.Y

答案 2 :(得分:0)

有几种潜在的解决方案,具体取决于您要实现的目标以及您希望如何解决。

在按照问题填写列表data之后,您可以在C#中使用类似以下的内容,然后使用结果更新数据库(如果您要这样做):

foreach(wayPoint in data)
{
    if(data.Any(d => (d.MPID != wayPoint.MPID) 
                     && (d.X == wayPoint.X) 
                     && (d.Y == wayPoint.Y)))
    {
        wayPoint.MultipleSite = 1;
    }
}

如果您不需要更新数据库,那应该没问题;否则,您可以使用上述结果来更新数据库,也可以在数据库中创建存储过程来执行类似的操作。

一个主意:

  • 使用值MPIDXY创建一个临时表,并使用主表中所有内容的副本填充它。
  • 遍历生成的临时表,并使用与上述if-结构相同的条件检查主表(为所有匹配{{1的行选择并获取MPID值}}和X值)。
  • 对于临时表中的每一行,请更新主表中的相关行,然后从临时表中删除已更新的行(注意:删除临时表中与已更新的行相对应的所有行在主表中意味着您将需要查询 临时表中至少少一行;毕竟,您无需检查是否已经知道它的Y值为MultipleSite )。

这听起来很沉重/缓慢,也许有更有效的方式来做您想要的事情,但是这种方式至少应该是可行和可理解的。

无论哪种方式,我都看不到如何遍历所有行,因为从本质上讲,这正是您想要执行的操作;检查每一行是否还有其他具有相同值的行。