【问题标题】:LINQ Query from Object Array Inside Database column string来自数据库列字符串内的对象数组的 LINQ 查询
【发布时间】:2015-11-03 21:30:08
【问题描述】:

抱歉,很难为疑问选择一个好的标题。

我正在使用 LINQ 在名为“Parameter”的特定列字符串上查询我的存储库,该列字符串具有 ';' 分隔符。数据库列是类似 "name1=value1;name2=value2;name3=value3" 的模式,我可以将其转换为名为 GenericParameter[] 拆分的对象';' 的字符串。

我处理 Parameter 的 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;
}

我正在重构它,因为这样我的 "param" 可以以不同的顺序传递,例如 "name2=value2;name1=value1" 并且可能不会一直匹配数据库列参数。

我正在尝试做这样的事情:

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匹配的存储库列参数(字符串)。由注释的 Where 表示的查询将不起作用。

请,我很感激任何建议。

【问题讨论】:

  • 首先,去掉你的 GenericParameter 类并使用Dictionary&lt;string,string&gt;。无需重新发明轮子。

标签: c# linq list


【解决方案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);

【讨论】:

  • 请注意,这不会很快。它内部将使用 LIKE %..% 来查找参数,这些参数将无法使用索引,因此会导致完整的表扫描,但是您当前的表设计并没有真正的解决方法.
  • 我使用“MyData”作为类型。只需替换为您的存储库返回的任何类型。您也可以将其设为通用,并使用 lambda 来请求将包含参数的字段,以便您可以在需要时对多个表使用相同的逻辑。
  • 谢谢@Robert Mckee。在您的回答中受到启发,我找到了解决方案。我没有使用 Dictionary,但我使用了 IQueryable 逻辑和 foreach 迭代基于“name1=value1;name2=value2;name3=value3”的拆分列表,然后查询存储库。 string[] 参数 = referer.Split(';'); foreach (var param in parameters) { query = query.Where(p => p.ParameterStr.ToLower().Contains(param.ToLower())); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多