2

MySQl 5.5.19、エンティティ フレームワーク 4.3 を使用し、Sun 提供の MySQL コネクタと DevArt コネクタの両方を試しましたが、両者に違いはありませんでした。

したがって、異なるクエリを生成する 2 つのステートメントがあります。1 つ目は次のとおりです。

var desserts = context.desserts
    .AsQueryable()
    .OrderBy(m => m.Id)
    .Where(m => m.FlavorId == 123)
    .ToList();

そして2つ目は

var desserts = context.desserts
    .AsQueryable()
    .OrderBy(m => m.Id)
    .Where(m => m.FlavorId == someFlavorId)
    .ToList();

最初のクエリは、次のような SQL クエリを生成します。

SELECT
  Extent1.Id,
  Extent1.Name,
  Extent1.FlavorId
FROM icecream.dessert AS Extent1
WHERE Extent1.FlavorId = 123
ORDER BY Extent1.Id ASC

2 番目のクエリは、次のような非常にコストのかかるクエリを生成します。

SELECT
  Project1.Id,
  Project1.Name,
  Project1.FlavorId
  FROM(
    SELECT
      Extent1.Id,
      Extent1.Name,
      Extent1.FlavorId
    FROM icecream.dessert AS Extent1
    WHERE Extent1.FlavorId = 123
  ) AS Project1
  ORDER BY Project1.Id ASC

そしてもちろん、後者のクエリは、私の製品コードで使用されているものです。これら 2 つの結果が異なるクエリになる理由がわかりません。

これを修正する方法はありますか?

4

1 に答える 1

2

最初のクエリは定数で渡し、2 番目のクエリはパラメータで渡すため、異なる SQL が生成されます。

最初のクエリを模倣したい場合は、次のような Where 述語の式を作成する必要があります。

ParameterExpression parameter = Expression.Parameter(typeof(Dessert), "d");
Expression propertyOrField = Expression.PropertyOrField(parameter , "FlavorId");
Expression constant = Expression.Constant(someFlavorId, typeof(long?));
Expression equal = Expression.Equal(propertyOrField, constant);

var lambda = Expression.Lambda<Func<Dessert, bool>>(equal, parameter);

var desserts = context.desserts
    .AsQueryable()
    .OrderBy(m => m.Id)
    .Where(lambda)
    .ToList();
于 2012-04-23T16:34:06.837 に答える