【发布时间】:2013-07-23 12:53:35
【问题描述】:
我开始构建一个网页来优化一些搜索结果。下面的代码运行良好,如果我添加一个查询字符串(即?beds=4,它会返回正确的结果。但是,如果我指定两个查询字符串(即?beds=4&sleeps=8,它返回匹配任何一个(所有具有 4 张床(不考虑睡眠)的属性和具有 8 个睡眠(不考虑床)的所有属性)的结果,而不是两者。我需要某种 AND 语句,以便结果匹配床和睡眠?
@{
Layout = "~/_SiteLayout.cshtml";
Page.Title = "Search";
string searchText = Request.Unvalidated["searchText"];
var searchTerms = searchText.Split('"').Select((element, index) => index % 2 == 0 ? element.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) : new string[] { element }).SelectMany(element => element).ToList();
for (int i=0; i<searchTerms.Count; i++)
{
if (searchTerms[i].ToUpper() == "THE" || searchTerms[i].ToUpper() == "AND" || searchTerms[i].ToUpper() == "AS" || searchTerms[i].ToUpper() == "AN" || searchTerms[i].ToUpper() == "BUT" || searchTerms[i].ToUpper() == "OR" || searchTerms[i].ToUpper() == "OF" || searchTerms[i].ToUpper() == "IF" || searchTerms[i].ToUpper() == "IS" || searchTerms[i].ToUpper() == "IN" || searchTerms[i].ToUpper() == "IT" || searchTerms[i].ToUpper() == "BY" || searchTerms[i].ToUpper() == "TO" || searchTerms[i].ToUpper() == "FOR" || searchTerms[i].Length <= 1 || String.IsNullOrWhiteSpace(searchTerms[i]))
{
searchTerms.RemoveAt(i);
i--; //decrements 'i' if an element is removed because all indexes after this one will drop by one. This ensures that no indexes get skipped.
}
}
var db = Database.Open("StayInFlorida");
string searchQueryString = "";
int termCount = searchTerms.Count;
string[] searchTermsArray = searchTerms.ToArray();
searchQueryString = "SELECT * FROM PropertyInfo WHERE numBedrooms = ";
for (int i=0; i<termCount; i++)
{
if (i != 0)
{
searchQueryString += "OR numBedrooms = "; //Ensures that this is not appended for the first term. Alternatively, of course, you can use "AND", depending on how you want the results returned, but you probably want "OR".
}
searchQueryString += "@" + i + " ";
}
searchQueryString += "UNION ";
searchQueryString += "SELECT * FROM PropertyInfo WHERE numSleeps = ";
for (int i=0; i<termCount; i++)
{
if (i != 0)
{
searchQueryString += "OR numSleeps = ";
}
searchQueryString += "@" + i + " ";
}
searchQueryString += "UNION ";
searchQueryString += "SELECT * FROM PropertyInfo WHERE numBathrooms = ";
for (int i=0; i<termCount; i++)
{
if (i != 0)
{
searchQueryString += "OR numBathrooms = ";
}
searchQueryString += "@" + i + " ";
}
searchQueryString += "ORDER BY anyTermYouWishToOrderBy DESC";
if (searchTermsArray.Length > 0) //Prevents a server-side error if the searchTerm list was empty when converted to the searchTermsArray
{
var queryResults = db.Query(searchQueryString, searchTermsArray);
}
}
【问题讨论】:
-
我不确定我是否完全理解您的要求,但我知道没有任何方法可以在查询字符串中包含逻辑
AND。我认为您应该采用的方法是收集查询字符串值并在服务器端处理您需要的物流(从代码的外观来看,使用 C#)。 -
当/如果我觉得我完全理解您需要的结果时,我很乐意给出更具体的答案。
-
嗨,感谢 VoidKing 回复我。所以我基本上需要从查询字符串中提取 2 个参数,并让它们在我的 SQL 选择语句中返回与它们匹配的结果。听起来是不是更清楚一点?
-
我猜上面的 2 个 IF 语句需要以某种方式合并在一起,但我想不出正确的语法
-
好吧,我刚刚在 cmets 中看到了您对 Mike 回答的附加规定。我必须说,对您所需解决方案的任何要求都应在您的问题中得到解决,以便第一次可以更合适地编写答案。话虽如此,我意识到您当时可能不知道您需要这个额外的功能。我知道这一直发生在我身上。我正在考虑如何最好地从逻辑上处理您的问题。
标签: sql razor webmatrix webmatrix-2