【问题标题】:Conditional clauses for linq to Db4O query?linq to Db4O 查询的条件子句?
【发布时间】:2009-03-27 13:18:32
【问题描述】:

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

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

【问题讨论】:

    标签: linq db4o


    【解决方案1】:

    这样的东西合适吗?

    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();
    

    【讨论】:

    • 哇,这是一篇旧帖子。我认为现在 linq to DB4O 支持 lambda 表达式。不确定,最近没有机会使用它。如果不是,您的解决方案可能会奏效。明天晚上有空我去看看:)
    • 我终于明白了,看来 linq 2 db4o 仍然无法获得我想要的东西。您建议的语法是可能的,但我仍然希望有一个更清晰的 (lambda) 语法。
    【解决方案2】:

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

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

    【讨论】:

    • 这确实是一个问题:如何避免第二个示例中的 where 子句变成 linq2objects?我希望它成为 linq2Db4o 的一部分,以便 db4o 引擎可以优化它。
    【解决方案3】:

    如果拆分表达式会怎样:

    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 查询吗?缺点当然是这个解决方案更加冗长而且不完全干燥..

    【讨论】:

    • 另外,在我的真实世界应用程序中,大约有 10 个参数都是可选的,所以这将是一个地狱般的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多