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

私はあなたが何を得ているのか分かりません。最初のケースでは、コードの一部がサーバー側で実行されるため、返される値を最適化することを心配していますか? しかし、2 番目のケースでは、列挙はローカルで行われるため、使用される値の最適化は行われませんか?

その場合、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 クエリを認識しますか? 欠点はもちろん、このソリューションははるかに冗長であり、正確にはDRYではありません..

于 2009-03-27T15:37:53.987 に答える