Фильтрация результатов на основе отдельного значения столбца или поля - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть приложение MVC 3, работающее с базой данных MS SQL 2008 с таблицей с именем Documents.Документы разбиты по абзацам в базе данных.Таблица документов имеет столбец DocText, содержащий текст каждого абзаца, столбец DocTitle, содержащий заголовок документа.В приложении MVC 3 есть функция поиска, которая может искать слово или фразу в столбце DocText или в столбце DocTitle.Все работает отлично, за исключением того, что если в конкретном документе искомое слово появляется в нескольких абзацах, мой список возвращает несколько экземпляров этого документа.Например, если пользователь выполняет поиск по слову «Бюджет», а в одном из документов слово «бюджет» находится в четырех разных абзацах, мой возвращенный список содержит этот документ четыре раза.

Чего я хочу добиться - перечислить каждый документ, в котором есть искомое слово.Я хочу перечислить документ по названию только один раз, независимо от того, сколько раз искомое слово появляется в этом документе.Единственный действительно уникальный столбец - это столбец RecordID, первичный ключ.

Мой контроллер:

    public class SearchController : Controller
{

    private GUICEEntities4 db = new GUICEEntities4();

    //
    // GET: /Search/

    public ActionResult Index(string Keyword)
    {
         #region Keyword Search
        if (!String.IsNullOrEmpty(Keyword)) {
            var SearchDoc = db.Documents.Where(r => r.DocText.ToUpper().Contains(Keyword.ToUpper()) || r.Title.ToUpper().Contains(Keyword.ToUpper()) || r.DocNum.ToUpper().Contains(Keyword.ToUpper()));

            ViewBag.CurrentKeyword = String.IsNullOrEmpty(Keyword) ? "" : Keyword;

            return View(SearchDoc.ToList());
        }
            else{
             return View();
            }
              #endregion
    }

 }

My View имеет следующее:

@foreach (var item in Model) {

    <tr>
        <td>
            <strong>AFI @Html.DisplayFor(modelItem => item.DocNum): @Html.DisplayFor(modelItem => item.Title)</strong>
            <br />
            @Html.DisplayFor(modelItem => item.DocSummary)
            <br />
            <span class="complianceitems">Number of compliance items:</span> (TBD)
        </td>

        <td>
            <a href="/Documents/Index/@(Html.DisplayFor(modelItem => item.DocNum))">Checklist
                Generator</a><br />
            <a href="/UploadedDocs/@Html.DisplayFor(modelItem => item.DocFileName)" target="_blank">
                Download PDF</a>
        </td>

Любойпредложения о том, как мне достичь своей цели?

ДОБАВЛЕНО: Каждый документ может быть идентифицирован столбцом DocNum, в котором указан уникальный номер документа для этого конкретного документа.Я пытался перебрать список для извлечения каждого необязательного DocNum, а затем попытался сделать так, чтобы DocNum больше не появлялся в цикле ... но мне это не удалось.

Следующий оператор SQL дает мнерезультаты мне нужны.В заявлении предполагается, что искомое слово «бюджет».Я не знаю, как получить те же результаты, используя EF.Есть предложения?

SELECT DISTINCT DocNum, Title FROM Documents
WHERE
DocText LIKE '%budget%'
OR
Documents.Title LIKE '%budget%'
OR
DocNum LIKE '%budget%'

1 Ответ

0 голосов
/ 10 ноября 2011

Проблема здесь в вашем EF-запросе, а не в том, что связано с MVC. Прошло много времени с тех пор, как я активно использовал EF, но, возможно, самый простой способ - сначала вернуть только RecordIds.

var recordIds= db.Documents
                  .Where(r => 
                         r.DocText.ToUpper().Contains(Keyword.ToUpper()) ||
                         r.Title.ToUpper().Contains(Keyword.ToUpper()) ||
                         r.DocNum.ToUpper().Contains(Keyword.ToUpper()))
                  .Select(d => d.RecordId)
                  .Distinct();

Я не совсем уверен, что вы будете делать с каждой отдельной записью, поскольку в вашем вопросе недостаточно информации. Но это должно помочь.

Обновление:

var foundDocs = new List<YourType>();
recordIds.ToList().ForEach(r => foundDocs.Add(db.TblDocLists.Single(l => l.TheDocNum == r)));
//I must point out that I'm not familiar with the latest versions of EF so this might be overkill.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...