如何使用RavenDb构造适当的WHERE子句

时间:2012-04-04 00:28:08

标签: ravendb

我已尝试过两种形式的通话,这一次

 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表达式的观点来看,2之间有什么区别,我忽略了任何可能否定我想要完成的事情,这是一个3项查询,每个术语都是AND在一起。

编辑:每个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#和和或

回到基础

谢谢你, 斯蒂芬

1 个答案:

答案 0 :(得分:2)

在第二个区块,你正在做一个&amp;而不是&amp;&amp;因此,它不是进行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操作,那么你不需要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))

提到这一点可能会使您的代码在未来难以维护。