C# linq到sql生成的实体

C# linq到sql生成的实体,c#,sql,linq,linq-to-entities,sql-like,C#,Sql,Linq,Linq To Entities,Sql Like,我在ado.net实体框架中使用linq to实体时遇到一些问题。基本上我所做的是: 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 + '%' 这很好,但我的表有数百万条记录,因此运行速

我在ado.net实体框架中使用linq to实体时遇到一些问题。基本上我所做的是:

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 + '%'
这很好,但我的表有数百万条记录,因此运行速度非常慢。我需要它来生成如下内容:

WHERE (CAST(CHARINDEX(@p, [Extent1].[Name]) AS int)) = 1
WHERE Name LIKE @p + '%'
我被到处搜索,除了使用存储过程或实体sql之外,找不到任何解决方案


有没有办法通过linq做到这一点?可能通过某种方式将linq扩展到实体linq提供程序,或者某种方式截取命令树或生成的查询?

哇,这真是一种奇怪的方式!请注意,LINQtoSQL(在本例中)使用
如@p0+'%'
。。。很奇怪

您正在使用哪个EF提供程序(数据库)?SQL Server


正如您所说,存储过程将完成该任务,但您不应该这样做。。。非常非常奇怪…

我不是SQL专家,但我猜这两种语法:

其中(CAST(CHARINDEX(@p[Extent1].[Name])AS int))=1

其中的名称类似于@p+'%'

将导致表扫描或理想的索引扫描。归根结底,他们的表现是一样的。我通过查看下面的执行计划来验证这一点。归根结底,您需要重新考虑您的数据库模式或您的数据库如何执行搜索。这不是LINQ问题

一个可能需要改进的地方是:确保您已经为正在搜索的列编制了索引

字母是字符吗?如果你把它做成一根绳子,会发生什么

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))
也许这更有效?

这是一个使用Linq的实体。与LIKE不同,显然这个构造不使用索引

我们已经成功地使用了Substring(也就是Substring)。执行计划类似,但在我们的例子中,查询的执行速度要快得多


这是另一个“我相信它将在EF 2中修复”…:-(

您可以非常轻松地使用实体的“真实相似”链接

以下是使其工作所需的:

此扩展方法现在将映射到EDMX函数


这里的更多信息:

正是这种情况让我非常不愿意放弃存储过程层,而选择任何生成SQL的方法。是的,我使用的是SQL Server 2005。据我所知,LINQ to SQL提供了一个SqlMethods类,它公开SQL函数和运算符,如LIKE,但在LINQ to Entiti中没有这样的东西es.Go figure…如果您在Note/Name列上有一个索引,并且基数不太低,它将用于LIKE“a%”查询。我不确定查询优化器是否能够将该索引用于CAST(CHARINDEX())操作。我在数据库的Name列上有一个索引。LIKE对生成的SQL(CHARINDEX)进行索引扫描做一个表格扫描,这就是为什么它需要这么长时间。底线是它们将执行相同的操作。错误。在存在索引的情况下,它们的性能差别很大。