0

在 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. 按名称过滤。

这不是我想要的解决方案。有什么建议么?

4

3 回答 3

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();
于 2009-08-31T06:37:35.857 回答
1

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

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

于 2009-03-27T13:25:55.287 回答
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 查询?缺点当然是这个解决方案更加冗长而且不完全干燥..

于 2009-03-27T15:37:53.987 回答