我正在构建一个MVC应用程序,在这个应用程序中,我需要根据用户使用的过滤器获取对象列表。

因此,我最终可能会遇到这样的字符串:

*OBJNAME=[SWORD][OF][THOUSAND][TRUTHS]*OBJTYPE=[ARTEFACT]*OBJNUMBER=[28]*COST=[9]+<*POWER=[3]+>=*RATING=[4]+<*OWNER=[WRIGHT][STAN]*OBJSET=[WORLD OF WARCRAFT]*RARITY=[LEGENDARY]*ADDCOST=[6QGBA]*OBJCOLOR=[ALL]

每个*是我在构建字符串时引入的标签,以便我可以分别标识DAL类中的每个属性:

public List<ObjInfo> ListObjWithQryString(string _objQry)
{
    List<ObjInfo> listToReturn = new List<ObjInfo>();

    char[] firstDelimiters = {'*'};

    string[] parsedValues = _objQry.Split(firstDelimiters,
       StringSplitOptions.RemoveEmptyEntries);

    foreach (string parsedValue in parsedValues)
    {
       if (parsedValue.Contains("OBJNAME"))
       {
           // WRITE CODE HERE
       }
    }

    return listToReturn;
}

现在,我的问题是基于以下事实:每个参数可能会或可能不存在,因此查询字符串将更改,我不想处理每种81种可能性,尤其是因为它最终可能会更改。

有什么方法可以根据获取的值动态地对我的数据库建立查询,以便仅返回我要查找的值?

*编辑*

这是我可能最终拥有的几个字符串示例:

*OBJNAME=[SWORD][OF][THOUSAND][TRUTHS]

// Seeking all objects named Sword of a Thousand Truths

*OBJNAME=[SWORD][OF][THOUSAND][TRUTHS*OBJNUMBER=[28]*COST=[9]+<*POWER=[3]+>=*RATING=[4]+<RARITY=[LEGENDARY]*ADDCOST=[6QGBA]*OBJCOLOR=[ALL]

// Seeking all objects named Sword of a Thousand Truths with number 28 with cost lesser than 9 with power greater or equal to 3 with rating lesser than 4 with rarity Legendary with additional cost 6QGBA with all colors

*OBJNAME=[SWORD][OF][THOUSAND][TRUTHS]*OBJTYPE=[ARTEFACT]*OBJNUMBER=[28]*COST=[9]+<*POWER=[3]+>=*RATING=[4]+<*OWNER=[STAN]*OBJSET=[WORLD OF WARCRAFT]

// Seeking all objects named Sword of a Thousand Truths with type Artefact with number 28 with cost lesser than 9 with power greater or equal to 3 with owner Stan with objSet World of Warcraft

*ADDCOST=[6QGBA]*OBJCOLOR=[ALL]

// Seeking all objects with additional cost 6QGBA with all colors

*ADDCOST=[6QGBA]*OBJCOLOR=[BLUE][RED][PURPLE]

// Seeking all objects with additional cost 6QGBA with specific color Blue, Red, Purple

*OBJTYPE=[ARTEFACT]*POWER=[3]+>=

// Seeking all objects with type Artefact and power greater or equal to 3

因此,您看到我可能最终对字符串使用了不同的标记。 如果需要,我可以粘贴其他信息。

*也*

请记住,这就是我现在构建应用程序的方式,但是如果有更好的做事方法,我可以接受任何建议。

编辑2

感谢@ I4V,我有了一个实际上将值分组的字典。 所以:

var dict = Regex.Matches(_cardQry, @"\*(\w+)=([^\*$]+)").Cast<Match>()
                            .ToDictionary(x => x.Groups[1].Value,
                                          x => string.Join(" ", x.Groups[2].Value.Split(new char[] {'[', ']'})));

会给字典。 如果我在字典中使用带有第一个参数的字符串在foreach进行foreach ,则结果如下:

核心价值

OBJNAME= SWORD  OF  THOUSAND TRUTHS  
OBJTYPE= ARTIFACT 
OBJNUMBER= 28 
COST= 9 +>= //(small bug here, there should not be a "=" sign at the end, but it's not major)
POWER= 3 +<=
RATING= 4+<
OWNER= STAN
OBJSET= WORLD OF WARCRAFT
RARITY= LEGENDARY
ADDCOST= 4  W  G  U  G  R 
OBJCOLOR= ALL 

并使用以下代码行:

var whereCondition = "WHERE " + String.Join(" AND ", dict.Select(kv => kv.Key + "='" + kv.Value + "'"));

我最终得到一个看起来像这样的字符串:

WHERE OBJNAME=' SWORD  OF  THOUSAND TRUTHS ' AND OBJTYPE=' ARTIFACT ' AND OBJNUMBER=' 28 ' AND COST=' 9 +<' AND POWER=' 3 +>' AND RATING=' 4 +<' AND OWNER=' STAN ' AND OBJSET='WORLD OF WARCRAFT ' AND RARITY=' LEGENDARY ' AND ADDCOST=' 4  W  G  U  G  R  ' AND OBJCOLOR=' ALL '

现在,麻烦不在于构建字符串,而在于如何使用它进行查询调用。 我是MVC应用程序的新手,尤其是数据库调用。 我通常这样进行数据库调用:

var objQry = from o in m_DB.O
             where o.NAME == _nameProvided
             select o;

如何使用字符串进行这样的查询调用?

===============>>#1 票数:1 已采纳

您可以从输入字符串创建字典。 使用它会更简单。

string input = "*OBJNAME=[SWORD][OF][THOUSAND][TRUTHS]*OBJTYPE=[ARTEFACT]*OBJNUMBER=[28]*COST=[9]+<*POWER=[3]+>=*RATING=[4]+<*OWNER=[WRIGHT][STAN]*OBJSET=[RETURN TO RAVNICA]*RARITY=[LEGENDARY]*ADDCOST=[6QGBA]*OBJCOLOR=[ALL]";

var dict = input.Split(new char[]{'*'},StringSplitOptions.RemoveEmptyEntries)
             .Select(p => p.Split('='))
             .ToDictionary(kv => kv[0], 
                           kv => kv[1].Replace("[", "").Replace("]", " ").Trim());

或使用正则表达式

var dict2 = Regex.Matches(input, @"\*(\w+)=([^\*$]+)").Cast<Match>()
            .ToDictionary(x => x.Groups[1].Value, 
                          x => String.Join(" ",x.Groups[2].Value.Split(new char[]{'[',']'},StringSplitOptions.RemoveEmptyEntries)));

  ask by hsim translate from so

未解决问题?本站智能推荐:

1回复

让最终用户使用asp.net动态创建自己的自定义查询。

我在这里非常需要一些指导,所以我的大学老师给了我们这个怪异的任务,他希望我们创建一个GUI,该GUI显示数据库中的表,从而使最终用户可以选择想要查询的表。他的桌子他想做什么? 例如,它可能是一条select,update或delete语句,此后,我们必须让他们使用WHERE子句,以便他们可以更
2回复

在LINQ查询中使用字符串

我目前正在用C#开发WPF项目。 该项目采用一个字符串(newMemoryRFID),该字符串在页面初始化时定义,并在查询中使用它。 像这样 这将产生一个空的DataContext 但是,当我使用与newMemoryRFID相同的测试数据时,即 查询获取正确的记录。
1回复

在Linq查询中构建“ where”子句

在此查询中,我始终需要'normal'类型的元素。 如果设置了_includeX标志,我也需要'workspace'类型的元素。 有没有一种方法可以将其写为一个查询? 还是在提交查询之前基于_includeX构建where子句?
1回复

使用linq进行动态查询

我有一个包含EntityName和EntityIds的审核模型。 我正在寻找一种创建动态查询的方法,该方法将从该表中检索EntityRecord和相关实体 这就是我到目前为止 我想得到的是,如果一个实体(例如“ Class”)具有相关的实体“ Students”。 我想创建
2回复

从属性名称的字符串创建表达式?

我正在尝试基于某些JSON创建查询,目前我已将JSON解析为一组规则,每个规则均包含字段名称,比较类型(=,>等)和要比较的值。 我遇到的问题是将其从该规则传递到IQueryable对象,我猜我需要使用反射并以某种方式构建表达式树,但是我不确定采用正确的方法... 假设我有:
2回复

不管搜索条件和参数如何变化,都保持选择查询不变

我正在使用DML和Selects的所有SQL脚本管理静态类。 但是,在某些情况下,搜索可能需要多个搜索条件。 例如 如果未提及容量或类型,则查询应返回所有项目, 这里有几个组合。 容量可以为空输入 类型可以为空输入 两者都可以为空输入
2回复

从Entity Framework动态查询实体以与主要实体关联

我知道标题不是最好的,但这是我真正想要完成的。 我有一个表示Entity1及其关联的详细信息视图。 我正在捕获键/值对中的属性名称和值。 我目前正在使用反射将实体属性设置为非关联的相应值。 我怀疑这是最有效的方法,但我一直无法找到使用表达式树的更好方法。 所以现在我需要根据这些实体
1回复

使用C#+ Entity Framework +存储过程构造动态查询

我正在开发一项功能,用户可以选择多个参数,每个参数中都包含多个值。 我试图找出一种使用C#在实体应用程序中设计此功能的方法,该实体框架将实体映射到存储过程。 由于安全原因,我的应用程序必须通过仅具有存储过程的代理数据库访问数据库。 因此,我的实体被映射到存储过程以进行插入,更新和选择。
1回复

RavenDB:使用Fiddler检索发送到数据库的查询的结构

是否可以使用Fiddler 4检索发送到RavendB(C#)的查询的结构? 实际上,我当前正在使用session.Query()编写查询来管理存储在RavenDB数据库中的数据。 我想将所有这些查询转换为session.Advanced.DocumentQuery()查询。 但是,其中一
1回复

如何在C#中的本地报表(.rdlc)中创建动态查询

在我的应用程序中,我有3个report.rdlc文件,它们的记录没有不同。我正在以带有选项按钮,复选框和组合框值的形式创建查询 我在选项按钮事件中使用了reporttype变量,以了解哪个报告将显示在报告查看器中。 并将选定的记录设置为数据网格查看器 我的报告从与记录字段兼容的临