我有以下查询:
sqlQuery = 'SELECT MPID, MAPPOINT, X, Y, MPCODE, MultipleSite = 0 FROM MAPPOINT'
var data = context.Database.SqlQuery<WayPoint>(sqlQuery).ToList();
我在下面粘贴了结果。
如果其他行具有相同的MultipleSite
和X
值,我想更新此结果并将Y
列设置为1。
例如:记录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; }
}
答案 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;
}
}
如果您不需要更新数据库,那应该没问题;否则,您可以使用上述结果来更新数据库,也可以在数据库中创建存储过程来执行类似的操作。
一个主意:
MPID
,X
和Y
创建一个临时表,并使用主表中所有内容的副本填充它。if
-结构相同的条件检查主表(为所有匹配{{1的行选择并获取MPID
值}}和X
值)。 Y
值为MultipleSite
)。这听起来很沉重/缓慢,也许有更有效的方式来做您想要的事情,但是这种方式至少应该是可行和可理解的。
无论哪种方式,我都看不到如何遍历所有行,因为从本质上讲,这正是您想要执行的操作;检查每一行是否还有其他具有相同值的行。