首页新闻找找看学习计划

EF+Mysql生成Sql的一个问题

0
悬赏园豆:30 [待解决问题]
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")也不会出错。

Macbeth的主页 Macbeth | 初学一级 | 园豆:126
提问于:2013-07-16 19:07
< >
分享
所有回答(3)
0

你用的EF的版本是多少?

dudu | 园豆:39099 (高人七级) | 2013-07-16 20:46

5.0

支持(0) 反对(0) Macbeth | 园豆:126 (初学一级) | 2013-07-16 22:45

哇哦,有幸得到博客园老大的回答,一定要帮我解决哈这个问题哈,困扰我好久了。。。

支持(0) 反对(0) Macbeth | 园豆:126 (初学一级) | 2013-07-16 22:47

@Macbeth: 试试

where s.TeamName.IndexOf(s3) >= 0
支持(0) 反对(0) dudu | 园豆:39099 (高人七级) | 2013-07-17 10:28

@dudu: 

一样有错误,只是把where后面的条件换成了

((LOCATE(@p__linq__0,`Extent1`.`TeamName`)) - 1) > 0
支持(0) 反对(0) Macbeth | 园豆:126 (初学一级) | 2013-07-18 09:09
0

我也遇到同样的问题。

另外,不知道是不是只针对mysql,调试时在intellitrace里面看不到生成的sql,特别是调用SaveChanges的时候,看不到就很难判断问题在哪里。

buaaytt | 园豆:202 (菜鸟二级) | 2013-07-25 11:32

已经把这个bug 提交给官方了。下个版本会修复

支持(0) 反对(0) Macbeth | 园豆:126 (初学一级) | 2013-07-25 22:07

@Macbeth: 

你说的是你的问题还是我说的看不到生成sql的问题?

支持(0) 反对(0) buaaytt | 园豆:202 (菜鸟二级) | 2013-07-26 14:06

你确定你的VS版本是enterprise 吗?

还有其它办法可以看到SQL语句在context之后,查询LINQ之前添加一句:

context.Database.Log = new Action<string>(q => Debug.WriteLine(q));

就可以在输出窗口看到生成的SQL了

支持(0) 反对(0) 我零0七 | 园豆:202 (菜鸟二级) | 2017-02-21 14:30
0

那最后EF能给你正确的结果吗?

如果能的话那就是你查看SQL的方式不对,这句SQL之前应该还有其它的SQL语句

你可以在context之后,查询LINQ之前添加一句:

context.Database.Log = new Action<string>(q => Debug.WriteLine(q));

就可以在输出窗口看到生成的SQL了

结果是不止包含着一句SQL

我零0七 | 园豆:202 (菜鸟二级) | 2017-02-21 14:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册