为了账号安全,请及时绑定邮箱和手机立即绑定

更新字段 IEnumerable 关于重复 c# EF

更新字段 IEnumerable 关于重复 c# EF

C#
墨色风雨 2021-10-09 14:05:20
我有以下查询:sqlQuery = 'SELECT MPID, MAPPOINT, X, Y, MPCODE, MultipleSite = 0 FROM MAPPOINT' var data = context.Database.SqlQuery<WayPoint>(sqlQuery).ToList();我把结果贴在下面。我想更新此结果和集MultipleSite有具有相同的其他行的列1的情况下,X和Y值。例如:记录 2 和 3 具有相同的X和Y值,所以我想将它们列的值更新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; }}
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

这可以在一个 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


查看完整回答
反对 回复 2021-10-09
?
萧十郎

TA贡献1815条经验 获得超13个赞

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


在按照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;

    }

}

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


一个想法:


创建一个包含值MPID、X和的临时表Y,并用主表中的所有内容的副本填充它。

迭代生成的临时表并使用与上述if-structure相同的标准检查主表(选择并获取MPID所有具有匹配X和Y-values 的行的-values)。

对于临时表中的每一行,更新主表中的相关行,然后从临时表中删除更新的行(注意:删除临时表中与主表中更新行相对应的所有行意味着您将不得不在临时表中查询至少少一行;毕竟您不需要检查您是否已经知道它的MultipleSite值为1)。

这可能听起来很重/很慢,也许有更有效的方法来做你想做的事,但它至少应该是可行和可以理解的。


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


查看完整回答
反对 回复 2021-10-09
  • 3 回答
  • 0 关注
  • 250 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信