0

我現在有從舊的數據庫收集數據的實體框架模型和我目前使用我Id性質的int搜索INT ID爲x實體框架開始4.1

我試圖建立一個搜索框具有自動完成功能,並希望自動完成功能根據樣本id是否包含或開始(尚未制定最終設計決定)返回記錄的子集,並且遇到將整數id轉換爲字符串的問題我通常會使用recs.Id.toString().StartsWith(recordId),但這顯然不支持實體框架

有沒有辦法解決這個限制?

我的代碼如下所示

型號:

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

http://stackoverflow.com/questions/7717253/how-do-i-query -an-integer-column-for-starts-with-in-entity-framework – Eldar

回答

1

我最終增加了對自動完成數據的視圖,並在SELECT語句中的數據轉換爲字符串,這解決了我的問題

1

無論你做什麼,這將導致一些awf ul在大型數據集上的性能,因爲您將無法使用任何索引。我的建議是使用觸發器或計劃任務將前導數字存儲在單獨的字段中並對其進行過濾。

+0

ya它正在使用一個超過1mil +記錄的數據庫,它已經存儲爲一個字符串值(oracle)並且被索引,但沒有正式的prjmary鍵存在,我可以簡單地創建一個ID的視圖只應改善這方面的性能 –

+0

如果你改變它以存儲ID作爲一個字符串,然後前導字符(或尾隨字符,取決於數據庫)通配符搜索將工作,但是包含仍然會生成表掃描。關係數據庫通常不能很好地處理打包的列數據。 –

0

異想天開的念頭:怎麼樣你創建一個計算,堅持你的數據庫表列,即轉換您的IDINT)轉換成字符串?

然後,你可以:

  • 穿上了那列的索引
  • 使用該字符串列一個簡單的字符串比較

基本上,你需要這樣的:

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

現在更新你EF模型 - 現在你應該有一個新的string字段IDAsText在你的對象類中。嘗試對該字符串字段運行自動填充比較。

+0

由於支持合同中的liscencing限制,我不能對數據庫進行更改,因爲我們正在將自定義報告數據放入獨立模式的視圖中,但是在數據庫中,因爲我上面已經提到了索引字符串列,所以我正在使用整數數據類型在模型上我只能在未來的數據api版本中重新審視這個決定,但現在必須保持原樣,直到視圖運行良好,並且能夠在大約180ms內過濾記錄,這足夠快爲我的方式拉他們爲自動完成 –