Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从具有不同值的字符串生成查询_C#_Asp.net Mvc_Linq_Dynamic Queries - Fatal编程技术网

C# 从具有不同值的字符串生成查询

C# 从具有不同值的字符串生成查询,c#,asp.net-mvc,linq,dynamic-queries,C#,Asp.net Mvc,Linq,Dynamic Queries,我正在构建一个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]*A

我正在构建一个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]
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 '
var objQry = from o in m_DB.O
             where o.NAME == _nameProvided
             select o;
使用这行代码:

var whereCondition = "WHERE " + String.Join(" AND ", dict.Select(kv => kv.Key + "='" + kv.Value + "'"));
我最终得到了一个非常有用的字符串,如下所示:

*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]
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 '
var objQry = from o in m_DB.O
             where o.NAME == _nameProvided
             select o;

如何使用该字符串进行此类查询调用?

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

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());

string input=“*OBJNAME=[swarm][OF][fund][TRUTHS]*OBJTYPE=[artifact]*OBJNUMBER=[28]*COST=[9]+=*RATING=[4]+您可以从输入字符串创建字典。使用它会更简单

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());


string input=“*OBJNAME=[swar][OF][fund][TRUTHS]*OBJTYPE=[artifact]*OBJNUMBER=[28]*COST=[9]+=[RATING=[4]+真正的问题是,你如何杀死那些没有生命的东西?对不起,我不得不这么做。只有南方公园的极客才会明白。@ChrisDixon:我喜欢这一集。是的,我有点想插上这个,这样我可以让人们对我的项目感兴趣(1)并“隐藏”我项目的真实本质(当然是世界主宰):)考虑提供几个输入/输出字符串的小例子——不清楚你想做什么。旁注-没有必要写“感谢信”(特别是多组)-请改为评论/投票回答,请避免变量名中出现部分/拼写错误的单词-“Qry”不是完全可读的单词。@AlexeiLevenkov好的,可以!真正的问题是,你如何杀死那些没有生命的东西?对不起,我不得不这么做。只有南方公园的极客才会明白。@ChrisDixon:我喜欢这一集。是的,我有点想插上这个,这样我可以让人们对我的项目感兴趣(1)并“隐藏”我项目的真实本质(当然是世界主宰):)考虑提供几个输入/输出字符串的小例子——不清楚你想做什么。旁注-没有必要写“感谢信”(特别是多组)-请改为评论/投票回答,请避免变量名中出现部分/拼写错误的单词-“Qry”不是完全可读的单词。@AlexeiLevenkov好的,可以!听起来很酷,但是现在,有了这本词典,我如何构建一个动态查询字符串,为我在这里列出的每个示例提供一个值列表?@HerveS你所说的
动态查询
是什么意思。你能举个例子吗?我的意思是,根据你给我的,每次点击这个方法时,我都会有一个不同的字典。因此,我需要让81个左右的人阅读这本字典,以解决所有问题。我想要的是一种动态的东西,允许我对数据库进行一次调用,而不是多次调用。@HerveS抱歉,我不明白你的意思。请您尝试上面的答案,并通过
foreach(dict中的var-kv)控制台打印结果。WriteLine(kv.Key+“=”+kv.Value)。在那之后,我们可以继续讨论。@HerveS只是一个想法(不是一个聪明的方式,只是一个例子)
var whereCondition=“WHERE”+String.Join(“AND”,dict.Select(kv=>kv.Key+”=“+kv.Value+”)
听起来很酷,但是现在,有了这本字典,我如何构建一个动态查询字符串,为我在这里列出的每个示例提供一个值列表?@HerveS你所说的
动态查询
是什么意思。你能举个例子吗?我的意思是,根据你给我的,每次点击这个方法时,我都会有一个不同的字典。因此,我需要让81个左右的人阅读这本字典,以解决所有问题。我想要的是一种动态的东西,允许我对数据库进行一次调用,而不是多次调用。@HerveS抱歉,我不明白你的意思。请您尝试上面的答案,并通过
foreach(dict中的var-kv)控制台打印结果。WriteLine(kv.Key+“=”+kv.Value)。在那之后,我们可以继续讨论。@HerveS只是一个想法(不是一个聪明的方式,只是一个例子)
var whereCondition=“WHERE”+String.Join(“AND”,dict.Select(kv=>kv.Key+”=“+kv.Value+”)
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)));