1 var s3 = "123"; 2 var ss2 = from s in db.Set<GameUser>() where s.TeamName.Contains(s3) orderby s.TeamName select s.TeamName;
生成的SQL
怎么是
{SELECT `Project1`.`TeamName` FROM `GameUser` AS `Project1` WHERE (LOCATE(@p__linq__0, `Extent1`.`TeamName`)) > 0 ORDER BY `Project1`.`TeamName` ASC}
注意看`Extent1`这个别名根本就没有,调试后发现 Where里面如果使用Contains,EndWith,StartWith。。。等方法,然后参数传一个变量进去,再加上orderby(不加orderby不会出错),解析出的Sql就会出错,如果把变量直接换成文字如
Contains("123"),EndWith("123")也不会出错。
你用的EF的版本是多少?
5.0
哇哦,有幸得到博客园老大的回答,一定要帮我解决哈这个问题哈,困扰我好久了。。。
@Macbeth: 试试
where s.TeamName.IndexOf(s3) >= 0
@dudu:
一样有错误,只是把where后面的条件换成了
((LOCATE(@p__linq__0,`Extent1`.`TeamName`)) - 1) > 0
我也遇到同样的问题。
另外,不知道是不是只针对mysql,调试时在intellitrace里面看不到生成的sql,特别是调用SaveChanges的时候,看不到就很难判断问题在哪里。
已经把这个bug 提交给官方了。下个版本会修复
@Macbeth:
你说的是你的问题还是我说的看不到生成sql的问题?
你确定你的VS版本是enterprise 吗?
还有其它办法可以看到SQL语句在context之后,查询LINQ之前添加一句:
context.Database.Log = new Action<string>(q => Debug.WriteLine(q));
就可以在输出窗口看到生成的SQL了
那最后EF能给你正确的结果吗?
如果能的话那就是你查看SQL的方式不对,这句SQL之前应该还有其它的SQL语句
你可以在context之后,查询LINQ之前添加一句:
context.Database.Log = new Action<string>(q => Debug.WriteLine(q));
就可以在输出窗口看到生成的SQL了
结果是不止包含着一句SQL