Код Сначала запрос «Множество ко многим»

У меня есть таблица кодов:

public class Code
{
    [Key]
    public int CodeID { get; set; }

    [Required]
    [StringLength(30)]
    public string Title { get; set; }

    [Required]
    [StringLength(150)]
    public string Description { get; set; }

    public DateTime DateAdded { get; set; }

    public DateTime LastUpdated { get; set; }

    [Required]
    [StringLength(30)]
    public string Project { get; set; }

    [Required]
    [StringLength(30)]
    public string CMS { get; set; }

    public int DotNetVersion { get; set; }

    [Required]
    [StringLength(150)]
    public string Dependencies { get; set; }

    [StringLength(30)]
    public string Author { get; set; }

    public string CodeFile { get; set; }

    [Required]
    [StringLength(100)]
    public string TFSLocation { get; set; }

    ////Creates a relationship in the DB with Tag
    //[ForeignKey("TagID")]
    public virtual ICollection Tags { get; set; }

    ////Purely for API
    //[Required]
    public int TagID { get; set; }
}

Таблица тегов:

public class Tag
{
    [Key]
    public int TagID { get; set; }

    [Required]
    [StringLength(30)]
    public string TagName { get; set; }

    ////Creates a relationship in the DB with Code
    public virtual ICollection Code { get; set; }
}

И модель представления:

public class CodeTagViewModel
{
    public List Tags { get; set; }
    public List SelectedTags { get; set; }        

    public int CodeID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public DateTime DateAdded { get; set; }
    public DateTime LastUpdated { get; set; }
    public string Project { get; set; }
    public string CMS { get; set; }
    public int DotNetVersion { get; set; }
    public string Dependencies { get; set; }
    public string Author { get; set; }
    public string CodeFile { get; set; }
    public string TFSLocation { get; set; }

}

И я пытаюсь запустить запрос, чтобы получить файлы кода, связанные с именами тегов, которые были найдены. На данный момент у меня есть что-то вроде этого:

        List models = new List();
        List codes = db.Code.ToList();

        foreach (Code code in codes)
        {
            models.Add(MapCodeToModel(code));
        }

        var orderedModels = models.ToList();

        if (!String.IsNullOrEmpty(searchString))
        {
            orderedModels = models.Where(x => x.Title.ToUpper().Contains(searchString.ToUpper()) || x.Description.ToUpper().Contains(searchString.ToUpper()) || x.Project.ToUpper().Contains(searchString.ToUpper()) || x.CMS.ToUpper().Contains(searchString.ToUpper()) || x.Dependencies.ToUpper().Contains(searchString.ToUpper()) || x.Author.ToUpper().Contains(searchString.ToUpper())).ToList();

            if(orderedModels.Count == 0)
            {
                var Tags = db.Tags;
                 orderedModels = models.SelectMany(x => x.SelectedTags).Select(t => t).Where(t => t.TagName).Contains(searchString).ToList();
            }
        }

        return View(orderedModels);

Поиск на основе других столбцов таблицы кодов работает нормально, я просто включил их, чтобы вы могли лучше понять, что я пытаюсь сделать; может быть, есть лучший способ, чем выполнение инструкции if, чтобы убедиться, что поиск сначала совпал с чем-то другим. Это просто поиск тегов, которые, похоже, не работают для меня.

Мне нужна помощь:

 orderedModels = models.SelectMany(x => x.SelectedTags).Select(t => t).Where(t => t.TagName).Contains(searchString).ToList();
0
nl ja de
Я сомневаюсь, что ваш код if condition упорядоченModels == models.ToList() будет когда-либо оцениваться как true. С другой стороны, я не могу понять, что именно вы пытаетесь сделать - возможно, вы можете привести пример!
добавлено автор VinayC, источник
не следует ли вам сопоставлять строку поиска с именами тегов, а затем искать файлы кода? Кажется, что вы соответствуете другим атрибутам CodeTagViewModel
добавлено автор VinayC, источник
Я отправил ответ, но, как я уже сказал, я не мог определить цель кода, который включает CodeTagViewModel . Более того, я уже указывал, что код никогда не будет вводить блок if , поэтому я не уверен, что мой ответ поможет вам, если вы действительно не хотите объяснить, что именно точно спрашивают!
добавлено автор VinayC, источник
Пример в выражении if :) Я пытаюсь запросить таблицу кодов на основе тега, введенного в качестве параметра поиска.
добавлено автор Kayra, источник
Как я писал в вопросе, мой запрос не работает. Не было бы большого смысла, если бы я задавал этот вопрос. Вы более чем можете опубликовать рабочий ответ, но у меня возникают проблемы с тем, чтобы в моей жизни было многого для многих в Linq.
добавлено автор Kayra, источник
Я не знаю, как еще объяснить это, я уточнил, что я пытаюсь сделать в вопросе и снова в этих комментариях. CodeTagViewModel позволяет передавать более одной модели в один вид. Блок if работает отлично, насколько я могу видеть, даже если это не так, но это не проблема (и я сказал в вопросе, если у вас есть лучший способ сделать это, то дайте мне знать). Кажется, вы пытаетесь ответить на вопрос, не зная, что вы делаете сами. Я ценю настроение, но это не поможет ни одному из нас.
добавлено автор Kayra, источник

2 ответы

Предполагая, что у вас есть перечисление тегов, вы можете найти файлы кода, непосредственно просматривая отношения с файлами кода -

var tags = ...//enumeration of tags
var matches = tags.SelectMany(t => t.Code); 

EDIT

Глядя на ваш код, я не понимаю, что именно вы пытаетесь найти здесь, но предположим, что ваша строка поиска должна соответствовать имени тега, а поиск совпадающих тегов должен быть прямым:

var tags = db.Tags.Where(t => t.TagName.ToUpper().Contains(searchString.ToUpper()));

EDIT
I don't understand why you need to search against the model. You can search directly against the code:

searchString = searchString.ToUpper();
var directMatches = db.Code.Where(c=> c.Title.ToUpper().Contains(searchString) ||
                        c.Description.ToUpper().Contains(searchString) ||    
                        ... (and so on)

Это даст совпадающие файлы кодов с другими атрибутами, а затем вы можете объединить это с совпадениями из поиска тегов, чтобы получить консолидированные результаты ( directMatches.Union (совпадения) ).

В другой заметке используйте ToList экономно - он реализует текущий запрос для генерации данных в памяти, поэтому инструкция кода, такая как

List codes = db.Code.ToList();

Это приведет ко всем строкам кода из базы данных в память. Аналогично, код if (orderedModels == models.ToList ()) не будет работать, потому что вы сравниваете два результата из ToList invocations, которые были бы двумя разными списками памяти и ссылочным сравнением из них не удастся.

1
добавлено
@ Кайра, см. Мое редактирование!
добавлено автор VinayC, источник
@Kayra, см. Мое редактирование
добавлено автор VinayC, источник
Как используется параметр поиска в этом запросе?
добавлено автор Kayra, источник
Для упорядоченных моделей необходимо изменить теги. Я пытаюсь предвидеть, что пользователь что-то ищет, поэтому он пытается сопоставляться на основе каждого столбца таблицы кодов. Вот что делает первый уровень в инструкции if. Но поскольку теги, связанные с каждым кодом, являются SelectedTags из таблицы тегов (список тегов, а не только один), у меня возникают проблемы с запросом.
добавлено автор Kayra, источник
Поиск против модели просмотра, потому что это то, что мне нужно передать в представление ...
добавлено автор Kayra, источник

Решил:

if(orderedModels.Count == 0)
            {
                var codesByTag = db.Code.Where(c => c.Tags.Any(t => t.TagName.ToUpper().Contains(searchString))).ToList();
                foreach (var searchResult in codesByTag)
                {
                    orderedModels.Add(MapCodeToModel(searchResult));
                }
            }

MapCodeToModel - это мой собственный объяснительный метод, который я могу отправить по запросу, если это поможет.

0
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)