如果有文字,则生成不同的查询

时间:2012-04-23 16:21:46

标签: mysql entity-framework linq-to-entities

使用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

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

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

1 个答案:

答案 0 :(得分:2)

它们产生不同的sql,因为你传递的第一个查询是常量,而第二个查询是你传入的参数。

如果你想模仿第一个查询,你需要为Where谓词创建一个Expression,如下所示:

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