2

使用 MySQl 5.5.19,实体框架 4.3,并尝试了 Sun 提供的 MySQL 连接器和 DevArt 连接器,两者之间没有任何区别。

所以,我有两个产生不同查询的语句。第一个是:

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

第二个是

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

第二个会产生一个成本更高的查询,看起来像这样:

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

而且,当然,后一个查询是我的生产代码中使用的查询。我很困惑为什么这两个会导致不同的查询。

任何想法如何解决这一问题?

4

1 回答 1

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 回答