如何在ASP.net MVC中进行这种搜索?

时间:2018-03-14 13:32:25

标签: c# sql linq predicate

我有一个ASP.NET MVC Web应用程序。

SQL表有一列ProdNum,它包含4892-34-456-2311等数据。

用户需要一个表单来搜索包含此字段的数据库。

问题是用户希望在UI剃刀视图中有4个单独的字段,而每个字段应与-之间的4个数据部分匹配。

例如ProdNum1ProdNum2ProdNum3ProdNum4字段应与489234456匹配, 2311

由于整个搜索表单包含许多字段,包括这4个字段,因此搜索逻辑基于从PredicateBuilder类继承的谓词。

这样的事情:

...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

但上面的代码有运行时错误:

  

LINQ表达式节点类型' ArrayIndex' LINQ to Entities`

不支持

有人知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

非常感谢所有回复,最后,我找到了解决问题的简单方法。 我只是在搜索字符串中添加额外的空格以匹配搜索条件,而不是重建模型和更改数据库表。因为数据格式总是:4892-34-456-2311,所以我使用Startwith(PODNum1)搜索第一个字段,并使用Contains(“ - ”+ PODNum2 +“ - ”)来搜索第二个和第三个字符串(替换PODNum1)到PODNum3),并使用EndWith(“ - ”+ PODNum4)搜索第4个字符串。这样,我不需要改变任何其他东西,这很简单。 再次,非常感谢所有回复。

答案 1 :(得分:0)

如果我理解这是正确的,你有一个列,你想要像4个不同的列一样?这不值得...为此,您需要Split每行列数据,创建一个类来处理分割数据,最后使用`List .Thats一个无用的解决方法。我建议你改用4列。

但如果您仍想使用现有的应用方法,则首先需要Split,如前所述。为此,以下是一个示例:

  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
}
}

现在,正如评论中所提到的,你可以宁愿一个类来处理所有数据。例如,让我们称之为mydata

public class mydata {

public string part1;

public string part2;

public string part3;

public string part4;
}

现在,在While的{​​{1}}循环中,声明此类的新实例并将值传递给它。例如:

SqlDatareader

在班级

中创建班级列表
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);
}
}

public class MyForm { List<MyData> storedData = new List<MyData>; } 的while循环中,最后添加:

SqlDatareader

最后,你有一个所有分割数据的列表。所以你可以轻松编写过滤逻辑:)

答案 2 :(得分:0)

正如评论中已经提到的,错误意味着在将表达式转换为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)