В настоящее время у меня есть модель Entity Framework, которая собирает данные из устаревшей базы данных, и в настоящее время я использую int в своих свойствах Id

Я пытаюсь создать окно поиска с возможностями автозаполнения и хочу, чтобы функция автозаполнения возвращала подмножество записей в зависимости от того, содержит ли образец id или начинается с (окончательное проектное решение еще не принято), и я возникают проблемы с преобразованием целого числа id в строку, поскольку я обычно использую recs.Id.toString().StartsWith(recordId), но это, очевидно, не поддерживается Entity Framework

Есть ли способ обойти это ограничение?

Мой код выглядит следующим образом

Модель:

public class Sample
{
  public Sample()
  {
      Tests = new List<Test>();
  }

public          int                     Id              { get; set; }
public          DateTime                SampleDate      { get; set; }
public          string                  Container       { get; set; }
public          string                  Product         { get; set; }
public          string                  Name            { get; set; }
public          string                  Status          { get; set; }

public virtual SamplePoint SamplingPoint { get; set; }
public virtual SampleTemplate SampleTemplate { get; set; }
public Customer ForCustomer { get; set; }
public virtual ICollection<Test> Tests { get; set; }
}

И запрос, который я сейчас пытаюсь применить к этой модели

[HttpGet]
public JsonResult AutoComplete(string partialId)
{
    var filteredSamples = 
                repo.AllSamples.Where( s =>                                   
                                String.Compare(s.Status, "A", false) == 0
                                && (s.Id.ToString()).StartsWith(partialId)
                        ).ToList();

    return Json(filteredSamples, JsonRequestBehavior.AllowGet);
}

Любые идеи были бы потрясающими, у меня нет идей на данный момент

0
Chris McGrath 25 Авг 2011 в 22:20

3 ответа

Лучший ответ

В итоге я добавил представление для данных автозаполнения и преобразовал данные в строку в операторе выбора, и это решило мою проблему.

1
Chris McGrath 12 Сен 2011 в 05:14

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

1
Chris Shain 25 Авг 2011 в 18:25

Безумная мысль: как насчет создания вычисляемого постоянного столбца в таблице базы данных, который преобразует ваш ID (INT) в строку?

Тогда вы могли:

  • поместите индекс в этот столбец
  • используйте простое сравнение строк в этом столбце строки

В принципе, вам понадобится это:

ALTER TABLE dbo.YourTable
  ADD IDAsText AS CAST(ID AS VARCHAR(10)) PERSISTED

Теперь обновите вашу модель EF - и теперь у вас должно быть новое поле string IDAsText в вашем классе объектов. Попробуйте выполнить сравнение автозаполнения с этим строковым полем.

0
marc_s 25 Авг 2011 в 20:41