linq到Db4O查询的条件子句?

时间:2009-03-27 13:18:32

标签: linq db4o

在linq to sql中我可以这样做:

var q = db.Colors;
if(! string.IsNullOrEmpty(colorName))
   q = q.Where(c=>c.Name.Equals(colorName));
return q.ToList();

在Db4O linq中,我不能这样做,因为我必须从

开始
var q = (from Color c in db
         select c);
if(! string.IsNullOrEmpty(colorName))
   q = q.Where(c=>c.Name.Equals(colorName));
return q.ToList();

这导致

  1. 所有颜色的完整枚举
  2. 按名称过滤。
  3. 这不是我瞄准的解决方案。 有什么建议吗?

3 个答案:

答案 0 :(得分:2)

这样的事情会适合吗?

return (from Color c in db
       where !String.IsNullOrEmpty(colorName) && c.Name.Equals(colorName)
       select c).ToList();

您还可以使用多个参数:

return (from Color c in db
       where (!String.IsNullOrEmpty(colorName) && c.Name.Equals(colorName))
          || (!String.IsNullOrEmpty(color1Name) && c.Name.Equals(color1Name))
          || (!String.IsNullOrEmpty(color2Name) && c.Name.Equals(color2Name))
          ...
       select c).ToList();

答案 1 :(得分:1)

我不确定你的目标是什么。您是否担心在第一种情况下,某些代码会执行服务器端,因此您可以优化返回的值。但在第二种情况下,枚举是在本地完成的,因此对使用的值没有优化?

如果是这样,LINQ to Objects无法避免这种情况。对象在内存中,因此无法避免枚举它们来执行过滤操作。

答案 2 :(得分:0)

如果你拆分表达式怎么办?

IDb4oLinqQuery<Color> q;
if(! string.IsNullOrEmpty(colorName))
{
  q = from Color c in db
      where c.Name.Equals(colorName)
      select c;
}
else
{
  q = from Color c in db
      select c;
}
return q.ToList();

这样Db4O预处理器可以看到2种不同的LINQ查询?下行偏离当然这个解决方案更冗长,而且不完全是DRY ..