使用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
当然,后一个查询是我的生产代码中使用的查询。我很困惑为什么这两个导致不同的查询。
任何想法如何解决这个问题?
答案 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();