Может ли кто-нибудь изменить этот запрос LINQ to SQL, чтобы он возвращал только один экземпляр каждой строки? - PullRequest
0 голосов
/ 21 сентября 2010
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 на узел, однако я просто хочу вернуть все узлы, которые имеют хотя бы 1 SessionTracking для NodeID, но мне не нужно чтобы получить Узлы более одного раза. Если для узла есть 4000 SessionTrackings (скажем, ID = 45), у меня все еще только один экземпляр 45 в моем IQueryable. Как я могу изменить свой запрос для этого? Пожалуйста, не беспокойтесь о том, зачем мне это нужно в Словаре, который таков.

Ответы [ 3 ]

1 голос
/ 21 сентября 2010

Вам просто нужно сообщить обработчику запросов, что вам нужны только отдельные экземпляры ваших объектов:

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);
0 голосов
/ 21 сентября 2010

Я думаю, вам нужно сделать что-то вроде

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();

Это должно дать вам все необходимое для итерации, без повторов.

0 голосов
/ 21 сентября 2010

Вот как вы можете получить первый сеанс:

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...