如何在 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 个数据部分相匹配

例如 ProdNum1ProdNum2ProdNum3ProdNum4 字段应与 489234、[=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;
}

现在,在 SqlDatareaderWhile 循环中,声明此 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)