Entity Framework 4.1 считает идентичные строки базы данных - PullRequest
1 голос
/ 06 января 2012

Моя настройка

У меня есть два класса, показанные здесь, разделенные до того, что необходимо в этом примере:

public class Photo : Entity
{
    [Key]
    public int Id { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }

    public Photo()
    {
        Tags = new List<Tag>();
    }
}


public class Tag : Entity
{
    [Key]
    public string Text { get; set; }

    public virtual ICollection<Photo> Photos { get; set; }

    public Tag()
    {
        Photos = new List<Photo>();
    }
}

Как показано выше, существует отношение «многие ко многим» между двумя сущностями.

Сначала я использую код EF 4.1.

Пример:

  • " photo1 " имеет " tag1 ", " tag2 " и " tag3 " в свойстве тегов навигации.
  • " photo2 " имеет " tag2 ", " tag3 " и " tag4 " в свойстве тегов навигации.
  • " photo3 " имеет " tag2 " и " tag4 " в свойстве тегов навигации.

Общее количество тегов на всех фотографиях:

  • "tag1": 1
  • "tag2": 3
  • "tag3": 2
  • "tag4": 2
  • Всего тегов: 8

Примечание

Моя конечная цель - это облако тегов, но с использованием MVC3:

http://www.geekzilla.co.uk/View960C74AE-D01B-428E-BCF3-E57B85D5A308.htm

Первый вопрос

Как мне (используя EF) узнать, сколько раз используется наиболее часто используемый тег (ы) (находя количество « tag2 »)? И то же самое для наименее используемых тегов (количество « tag1 » в приведенном выше примере).

В ссылке выше используются следующие строки кода:

double.TryParse(tagData.Compute("min(count)", null).ToString(), out min);
double.TryParse(tagData.Compute("max(count)", null).ToString(), out max);

Что такое эквивалент EF / LINQ?

Второй вопрос

Как получить счетчик для каждого тега или счетчик для 50 наиболее часто используемых тегов?

1 Ответ

2 голосов
/ 06 января 2012

Подсчитывает по тегу:

from t in Context.Tags
select new
{
    t.Text,
    t.Photos.Count()
}

Наиболее часто используемый тег:

(from t in Context.Tags
let photoCount = t.Photos.Count()
orderby photoCount descending
select new
{
    t.Text,
    photoCount
}).FirstOrDefault()

50 наиболее часто используемых тегов (можеттам на самом деле нет 50):

(from t in Context.Tags
let photoCount = t.Photos.Count()
orderby photoCount descending
select new
{
    t.Text,
    photoCount
}).Take(50)

От руки, поэтому может быть не на 100% синтаксически правильным или наименьшим / наиболее читаемым способом сделать это.

Редактировать: Добавленный пример:

foreach(var result in Context.Tags.Select(x => new { t.Text, t.Photos.Count() }))
{
    Console.WriteLine(string.Format("Text: {0}, Count: {1}", result.Text, result.Count.ToString());
}
...