linq给实体生成了sql
我在ado.netentity framework中的实体中遇到了一些问题。 基本上我正在做的是这样的:
var results = (from c in companies where c.Name.StartsWith(letter) select c);
并将其转换为SQL,如:
WHERE (CAST(CHARINDEX(@p, [Extent1].[Name]) AS int)) = 1
这很好,但我的表有数百万的记录,所以这运行非常慢。 我需要它生成的是:
WHERE Name LIKE @p + '%'
我搜索高低,除了使用存储过程或使用实体sql之外,找不到任何解决方案…
有没有办法通过linq做到这一点? 可能通过某种方式将linq扩展到实体linq提供程序,或以某种方式拦截命令树或生成的查询?
我不是SQL专家,但猜测两种语法:
WHERE(CAST(CHARINDEX(@ p,[Extent1]。[Name])AS int))= 1
和
在哪里名字喜欢@p +’%’
将导致表扫描或理想情况下索引扫描。 底线他们将执行相同的操作。 我通过查看下面的执行计划来validation这一点。 最重要的是,您需要重新考虑数据库架构或执行搜索的方式。 这不是LINQ问题。
一个可能的改进领域:确保您已将要搜索的列编入索引。
替代文字http://sofzh.miximages.com/c%23/plan1.gif
替代文字http://sofzh.miximages.com/c%23/plan2.gif
哇,这是一个真正奇怪的做法! 请注意,LINQ-to-SQL(在本例中)使用LIKE @p0 + '%'
…非常奇怪。
你使用哪个EF提供商(数据库)? SQL Server?
正如你所说,存储过程将是你的工作,但你不应该这样做……非常非常奇怪……
这是Linq to Entities的一个已知问题 。 与LIKE不同,显然这个构造不使用索引。
我们使用Substring(转换为SUBSTRING)取得了一些成功。 执行计划类似,但在我们的例子中,查询执行得更快。
这是另一个“我确定它将在EF 2中修复”…… 🙁
“信”是个字母吗? 如果你把它变成了一个字符串,会发生什么?
var results = (from c in companies where c.Name.StartsWith(letter.ToString()) select c);
我尝试使用这种语法
Name.Substring(0, 1) == "E"
生成此SQL
WHERE N'E' = (SUBSTRING([Name], 0 + 1, 1))
也许这更有效率?
您可以非常轻松地使用链接到实体中的真实内容
以下是使其工作所需的内容:
加
searchingIn LIKE lookingFor
到此标签中的EDMX:
EDMX:EDMX / EDMX:运行/ EDMX:ConceptualModels /架构
还要记住
属性中的
然后在上面的命名空间中添加一个扩展类:
public static class Extensions { [EdmFunction("DocTrails3.Net.Database.Models", "String_Like")] public static Boolean Like(this String searchingIn, String lookingFor) { throw new Exception("Not implemented"); } }
此扩展方法现在将映射到EDMXfunction。
更多信息: http : //jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html