任何人都可以修改这个LINQ to SQL查询,这样它只返回每一行的一个实例吗?

时间:2010-09-20 22:01:25

标签: c# linq-to-sql

var nodes = (from n in db.Nodes
                 join st in db.SessionTrackings on n.NodeID equals st.NodeID
                 where st.UserID == userid && st.GroupID == groupid
                 select n);

IDictionary<int, bool> trackingData = new Dictionary<int, bool>();

foreach (Node n in nodes)
{
    trackingData.Add(new KeyValuePair<int, bool>(n.ID, true));
}

我不断收到'已经添加了该密钥',因为每个节点可能有很多SessionTrackings,但是我只想找回NodeID中至少有1个SessionTrack的所有节点,但我不需要多次获取节点。如果节点有4000个SessionTrack(比如ID = 45),我的IQueryable中仍然只有一个Node 45实例。如何修改我的查询?请不要担心为什么我需要它在字典中就像它一样。

3 个答案:

答案 0 :(得分:1)

您只需告诉查询引擎您只需要对象的不同实例:

var nodes = (from n in db.Nodes 
             join st in db.SessionTrackings on n.NodeID equals st.NodeID 
             where st.UserID == userid && st.GroupID == groupid 
             select n).Distinct();

IDictionary<int, bool> trackingData = nodes.ToDictionary(n => n.ID, n => true);

如果您不需要nodes查询其他任何内容,您可以合并这样的语句:

IDictionary<int, bool> trackingData =
            (from n in db.Nodes 
             join st in db.SessionTrackings on n.NodeID equals st.NodeID 
             where st.UserID == userid && st.GroupID == groupid 
             select n.Id)
            .Distinct()
            .ToDictionary(i => i, i => true);

答案 1 :(得分:0)

这是你第一次参加会议的方式:

var nodes = (from n in db.Nodes 
    join st in db.SessionTrackings on n.NodeID equals st.NodeID 
    where st.UserID == userid && st.GroupID == groupid 
    select n)
    .GroupBy(n => n.ID)
    .Select(g => g.First());

答案 2 :(得分:0)

我认为你需要做一些像

这样的事情
var nodeids = (from n in db.Nodes
join st in db.SessionTrackings on n.NodeID equals st.NodeId
where  st.UserId.equals(userid) && st.GroupID.equals(groupid)
select new {Id = n.Id})).distinct();

这应该可以为您提供迭代所需的一切,而无需重复。