如何在 ASP.net MVC 中进行这种搜索?
How to do this kind of search in ASP.net MVC?
我有一个 ASP.NET MVC 网络应用程序。
SQLtable有一列ProdNum
,其中包含4892-34-456-2311
.
等数据
用户需要一个表单来搜索包含此字段的数据库。
问题是用户希望在 UI razor 视图中有 4 个单独的字段,而每个字段应与上述 -
.
之间的 4 个数据部分相匹配
例如 ProdNum1
、ProdNum2
、ProdNum3
和 ProdNum4
字段应与 4892
、34
、[=21= 匹配], 2311
.
由于整个搜索表单包含很多字段,包括这 4 个字段,因此搜索逻辑基于继承自 PredicateBuilder
class.
的谓词
像这样:
...other field to be filtered
if (!string.IsNullOrEmpty(ProdNum1) {
predicate = predicate.And(
t => t.ProdNum.toString().Split('-')[0].Contains(ProdNum1).ToList();
...other fields to be filtered
但是上面的代码有运行-时间错误:
The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities`
有人知道如何解决这个问题吗?
如果我理解正确,你有一个栏目你想像 4 个不同的栏目一样?这是不值得的...为此,您需要 Split
每行列数据,创建一个 class 来处理拆分数据,最后使用一个 `List 。那是一个无用的 workaround.I 而是建议您改为使用 4 列。
但是,如果您仍然想使用现有的应用方法,您首先需要 Split
正如我提到的 earlier.For,这是一个示例:
public void test()
{
SqlDataReader datareader = new SqlDataReader;
while (datareader.read)
{
string part1 = datareader(1).toString.Split("-")(0);///the 1st part of your column data
string part2 = datareader(1).toString.Split("-")(1);///the 2nd part of your column data
}
}
现在,如评论中所述,您可以使用 class 来处理所有 data.For 示例,我们称它为 mydata
public class mydata {
public string part1;
public string part2;
public string part3;
public string part4;
}
现在,在 SqlDatareader
的 While
循环中,声明此 class 的新实例并将值传递给 it.An 示例:
public void test()
{
SqlDataReader datareader = new SqlDataReader;
while (datareader.read)
{
Mydata alldata = new Mydata;
alldata.Part1 = datareader(1).toString.Split("-")(0);
alldata.Part2 = datareader(1).toString.Split("-")(1);
}
}
在 class-level
中创建 class 的列表
public class MyForm
{
List<MyData> storedData = new List<MyData>;
}
在 SqlDatareader
的 while 循环中,在末尾添加:
storedData.Add(allData);
所以最后,你有一个所有拆分数据的列表..所以很容易写你的过滤逻辑:)
非常感谢大家的回复,我终于找到了一个简单的方法来解决它。
我没有重建模型和更改数据库表,而是在搜索字符串中添加额外的 space 以匹配搜索条件。由于数据格式始终是:4892-34-456-2311,所以我使用 Startwith(PODNum1) 搜索第一个字段,并使用 Contains("-" + PODNum2 + "-") 搜索第二和第三个字符串(替换 PODNum1到 PODNum3),并使用 EndWith("-" + PODNum4) 搜索第 4 个字符串。这样,我不需要更改任何其他内容,很简单。
再次非常感谢所有回复,非常感谢。
如评论中所述,该错误意味着在将表达式转换为 SQL 时不支持通过索引访问数据(请参阅 [0]
)。 Split('-')
也不支持,因此您必须求助于支持的函数 Substring()
和 IndexOf(startIndex)
.
您可以执行如下操作,首先将字符串转换为 4 数字字符串 ...
.Select(t => new {
t.ProdNum,
FirstNumber = t.ProdNum.Substring(0, t.ProdNum.IndexOf("-")),
Remainder = t.ProdNum.Substring(t.ProdNum.IndexOf("-") + 1)
})
.Select(t => new {
t.ProdNum,
t.FirstNumber,
SecondNumber = t.Remainder.Substring(0, t.Remainder.IndexOf("-")),
Remainder = t.Remainder.Substring(t.Remainder.IndexOf("-") + 1)
})
.Select(t => new {
t.ProdNum,
t.FirstNumber,
t.SecondNumber,
ThirdNumber = t.Remainder.Substring(0, t.Remainder.IndexOf("-")),
FourthNumber = t.Remainder.Substring(t.Remainder.IndexOf("-") + 1)
})
...然后你可以简单地写一些像
if (!string.IsNullOrEmpty(ProdNum3) {
predicate = predicate.And(
t => t.ThirdNumber.Contains(ProdNum3)
我有一个 ASP.NET MVC 网络应用程序。
SQLtable有一列ProdNum
,其中包含4892-34-456-2311
.
用户需要一个表单来搜索包含此字段的数据库。
问题是用户希望在 UI razor 视图中有 4 个单独的字段,而每个字段应与上述 -
.
例如 ProdNum1
、ProdNum2
、ProdNum3
和 ProdNum4
字段应与 4892
、34
、[=21= 匹配], 2311
.
由于整个搜索表单包含很多字段,包括这 4 个字段,因此搜索逻辑基于继承自 PredicateBuilder
class.
像这样:
...other field to be filtered
if (!string.IsNullOrEmpty(ProdNum1) {
predicate = predicate.And(
t => t.ProdNum.toString().Split('-')[0].Contains(ProdNum1).ToList();
...other fields to be filtered
但是上面的代码有运行-时间错误:
The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities`
有人知道如何解决这个问题吗?
如果我理解正确,你有一个栏目你想像 4 个不同的栏目一样?这是不值得的...为此,您需要 Split
每行列数据,创建一个 class 来处理拆分数据,最后使用一个 `List 。那是一个无用的 workaround.I 而是建议您改为使用 4 列。
但是,如果您仍然想使用现有的应用方法,您首先需要 Split
正如我提到的 earlier.For,这是一个示例:
public void test()
{
SqlDataReader datareader = new SqlDataReader;
while (datareader.read)
{
string part1 = datareader(1).toString.Split("-")(0);///the 1st part of your column data
string part2 = datareader(1).toString.Split("-")(1);///the 2nd part of your column data
}
}
现在,如评论中所述,您可以使用 class 来处理所有 data.For 示例,我们称它为 mydata
public class mydata {
public string part1;
public string part2;
public string part3;
public string part4;
}
现在,在 SqlDatareader
的 While
循环中,声明此 class 的新实例并将值传递给 it.An 示例:
public void test()
{
SqlDataReader datareader = new SqlDataReader;
while (datareader.read)
{
Mydata alldata = new Mydata;
alldata.Part1 = datareader(1).toString.Split("-")(0);
alldata.Part2 = datareader(1).toString.Split("-")(1);
}
}
在 class-level
中创建 class 的列表public class MyForm
{
List<MyData> storedData = new List<MyData>;
}
在 SqlDatareader
的 while 循环中,在末尾添加:
storedData.Add(allData);
所以最后,你有一个所有拆分数据的列表..所以很容易写你的过滤逻辑:)
非常感谢大家的回复,我终于找到了一个简单的方法来解决它。 我没有重建模型和更改数据库表,而是在搜索字符串中添加额外的 space 以匹配搜索条件。由于数据格式始终是:4892-34-456-2311,所以我使用 Startwith(PODNum1) 搜索第一个字段,并使用 Contains("-" + PODNum2 + "-") 搜索第二和第三个字符串(替换 PODNum1到 PODNum3),并使用 EndWith("-" + PODNum4) 搜索第 4 个字符串。这样,我不需要更改任何其他内容,很简单。 再次非常感谢所有回复,非常感谢。
如评论中所述,该错误意味着在将表达式转换为 SQL 时不支持通过索引访问数据(请参阅 [0]
)。 Split('-')
也不支持,因此您必须求助于支持的函数 Substring()
和 IndexOf(startIndex)
.
您可以执行如下操作,首先将字符串转换为 4 数字字符串 ...
.Select(t => new {
t.ProdNum,
FirstNumber = t.ProdNum.Substring(0, t.ProdNum.IndexOf("-")),
Remainder = t.ProdNum.Substring(t.ProdNum.IndexOf("-") + 1)
})
.Select(t => new {
t.ProdNum,
t.FirstNumber,
SecondNumber = t.Remainder.Substring(0, t.Remainder.IndexOf("-")),
Remainder = t.Remainder.Substring(t.Remainder.IndexOf("-") + 1)
})
.Select(t => new {
t.ProdNum,
t.FirstNumber,
t.SecondNumber,
ThirdNumber = t.Remainder.Substring(0, t.Remainder.IndexOf("-")),
FourthNumber = t.Remainder.Substring(t.Remainder.IndexOf("-") + 1)
})
...然后你可以简单地写一些像
if (!string.IsNullOrEmpty(ProdNum3) {
predicate = predicate.And(
t => t.ThirdNumber.Contains(ProdNum3)