1

我已经尝试了 2 种形式的调用,这个

 products = DocumentSession.Query<Product>()
      .Statistics(out stats)
      .Where(p => p.INFO2.StartsWith(term1))
      .Where(p => p.INFO2.StartsWith(term2))
      .Where(p => p.INFO2.StartsWith(term3)) 
      .OrderByField(columnToSortBy, columnToSortByAsc)
      .Skip(pageIndex * pageSize)
      .Take(pageSize)
      .ToList()
      ;

这样

  products = DocumentSession.Query<Product>()
      .Statistics(out stats)
      .Where(p => p.INFO2.StartsWith(term1) & p.INFO2.StartsWith(term2) & p.INFO2.StartsWith(term3))
      .OrderByField(columnToSortBy, columnToSortByAsc)
      .Skip(pageIndex * pageSize)
      .Take(pageSize)
      .ToList()
      ;

第一个返回的记录更符合我的预期,而第二个似乎返回所有 Product 类型的文档。从 LINQ 表达式的角度来看,两者之间有什么区别,我是否忽略了任何可能否定我想要完成的事情的事情,即 3 项查询并且每个项都被“与”在一起。

编辑:每个 Russ 的修改代码。

  string t1 = terms[0];
  string t2 = terms[1];
  string t3 = terms[2];

  products = DocumentSession.Query<Product>()
      .Statistics(out stats)
      .Where(p => p.INFO2.StartsWith(t1) && p.INFO2.StartsWith(t2) && p.INFO2.StartsWith(t3)) 
      .OrderByField(columnToSortBy, columnToSortByAsc)
      .Skip(pageIndex * pageSize)
      .Take(pageSize)
      .ToList()
      ;

编辑 2:这是您将脸朝下砸在键盘或任何其他实体物体上的地方...必须使用标准 C# And and Or 回到这里的基本内容

谢谢你,斯蒂芬

4

1 回答 1

2

在第二个块中,您正在执行 & 而不是 && 所以不是 AND 比较,而是尝试执行按位运算。

编辑:在第二种情况下,您可以更改:

.Where(p => p.INFO2.StartsWith(terms[0]) & p.INFO2.StartsWith(terms[1]) & p.INFO2.StartsWith(terms[2]))

对此:

.Where(p => p.INFO2.StartsWith(terms[0]) && p.INFO2.StartsWith(terms[1]) && p.INFO2.StartsWith(terms[2]))

这使它成为正确的 AND 子句。

第二次编辑:如果这是一个 AND 操作,那么您不需要 3 个术语 - 您需要一个术语,否则您将与同一字符串的 3 个实例进行比较。

terms[0] = "test";
terms[1] = "test";
terms[2] = "test";

.Where(p => p.INFO2.StartsWith(terms[0]) && p.INFO2.StartsWith(terms[1]) && p.INFO2.StartsWith(terms[2]))

是相同的

string term = "test";

.Where(p => p.INFO2.StartsWith(term) && p.INFO2.StartsWith(term) && p.INFO2.StartsWith(term))

只是提到这一点,因为这可能会使您的代码在将来更难维护。

于 2012-04-04T00:33:35.767 回答