2015-11-03 40 views
0

對不起,很難爲疑問選擇一個好標題。對象數組中的LINQ查詢數據庫內部列字符串

我在使用LINQ查詢名​​爲「參數」的特定列字符串,它具有';'分離器。數據庫列是一個模式,如「name1 = value1; name2 = value2; name3 = value3」,我可以將其轉換爲名爲的對象GenericParameter []將字符串分割爲';'

與參數處理我的GenericParameter類看起來是這樣的:

public class GenericParameter 
    { 
     public string Name {get; set;} //name1 
     public string Value {get; set;}//value1 

public static GenericParameter[] GetParameters(string parameters) 
     { 
      List<GenericParameter> chargingParameterList = new List<GenericParameter>(); 

      if (!string.IsNullOrEmpty(parameters)) 
      { 
       string[] splitedChargingParameter = parameters.Trim().Split(';'); 

       foreach (string parameter in splitedChargingParameter) 
       { 
        string[] pair = parameter.Split('='); 
        if (pair.Length != 2) continue; 

        GenericParameter genericParameter = new GenericParameter() 
        { 
         Name = pair[0].Trim(), 
         Value = pair[1].Trim() 
        }; 

        chargingParameterList.Add(genericParameter); 
       } 
      } 
      return chargingParameterList.ToArray(); 
     } 
    } 

的方法,現在我的工作看起來像這樣:

public ICollection<MyData> GetMyDataByParameter(string param) 
{ 
//param="name1=value1;name2=value2" 

List<MyData> dataToReturn = context 
          .MyDataRepository 
          .AsQueryable() 
          .Where(p => p.ParameterStr.Contains(param)) 
          .ToList(); 
return dataToReturn; 
} 

我重構它,因爲在這個方式我的「參數」可以通過不同的命令,如「名稱2 =值2;名稱1 =值1」並可能不匹配數據庫列參數所有的時間。

我試圖做這樣的事情:

public ICollection<MyData> GetMyDataByParameter(string param) 
    { 
    GenericParameter[] receivedParamArray = GenericParameter.GetParameters(param); 
    //param="name1=value1;name2=value2" 
    //GenericParameter[0].Name is "name1" 
    //GenericParameter[0].Value is "value1" 

    // TODO: QUERY the records on repository that matchs all the 
    //receivedParamArray 
    List<MyData> dataToReturn = context 
           .AsQueryable() 
           //.Where(p => p.ParameterStr.Contains(receivedParamArray)) 
           .ToList(); 

    return dataToReturn; 
    } 

我怎樣才能查詢庫列參數(字符串)是配襯所有receivedParamArray。由註釋表示的查詢將無法工作。

請,我欣賞任何建議。

+0

首先,擺脫你的GenericParameter類和使用'詞典<字符串,字符串>'。不需要再次重新發明輪子。 –

回答

1
public static IQueryable<MyData> FilterByParameters(this IQueryable<MyData>,Dictionary<string,string> dict) 
{ 
    IQueryable<Mydata> query=this; 
    foreach(var entry in dict) 
    { 
    string val = String.Format(";{0}={1};",entry.Key,entry.Value); 
    query=query.Where(a=>(";"+a.ParameterStr+";").Contains(val)); 
    } 
    return query; 
} 
public static IQueryable<MyData> FilterByParameters(this IQueryable<MyData>,string s) 
{ 
    return this.FilterByParameters(GetParameters(s)); 
} 
public static Dictionary<string,string> GetParameters(string s) 
{ 
    return s.Split(';') 
    .Where(t=>t.Contains("=")) 
    .ToDictionary(t=>t.Split('=')[0].Trim,t=>t.Split('=')[1].Trim()); 
} 

像這樣來使用:

var results=db.MyData.FilterByParameters("name1=value1"); 

var search=new Dictionary<string,string>{{"name1","value1"},{"name2","value2"}}; 
var results=db.MyData.FilterByParameters(search); 
+0

請注意,這不會很快。它將間接地使用LIKE%..%來查找參數,這些參數將無法使用索引,因此它會導致完整的表掃描,但是使用當前的表設計並沒有真正的解決方法。 –

+0

我使用「MyData」作爲類型。只需替換您的存儲庫返回的任何類型。你也可以使這個泛型,並使用lambda來請求將包含參數的字段,以便您可以根據需要在多個表上使用相同的邏輯。 –

+0

謝謝@Robert Mckee。啓發你的回答,我找到了我的解決方案。我沒有使用Dictionary,但是我使用IQueryable邏輯和foreach基於「name1 = value1; name2 = value2; name3 = value3」在分割列表上迭代,然後查詢Repository。 string [] parameters = referer.Split(';'); foreach(var參數中的參數) { query = query.Where(p => p.ParameterStr.ToLower()。Contains(param.ToLower())); } – renanroncarati