[英]linq to entities generated sql
我在ado.net實體框架中的實體中遇到了一些問題。 基本上我正在做的是:
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 +'%'
將導致表掃描或理想情況下索引掃描。 底線他們將執行相同的操作。 我通過查看下面的執行計划來驗證這一點。 最重要的是,您需要重新考慮數據庫架構或執行搜索的方式。 這不是LINQ問題。
一個可能的改進領域:確保您已將要搜索的列編入索引。
哇,這是一個真正奇怪的方式! 請注意,LINQ-to-SQL(在本例中)使用LIKE @p0 + '%'
...非常奇怪。
您使用哪個EF提供商(數據庫)? SQL Server?
正如你所說,一個存儲過程將在工作,但你不應該這樣做...非常,非常奇怪...
這是Linq to Entities的一個已知問題 。 與LIKE不同,顯然這個構造不使用索引。
我們使用Substring(轉換為SUBSTRING)取得了一些成功。 執行計划類似,但在我們的例子中,查詢執行得更快。
這是另一個“我確定它將在EF 2中修復”...... :-(
您可以非常輕松地使用鏈接到實體中的真實內容
以下是使其工作所需的內容:
加
<Function Name="String_Like" ReturnType="Edm.Boolean">
<Parameter Name="searchingIn" Type="Edm.String" />
<Parameter Name="lookingFor" Type="Edm.String" />
<DefiningExpression>
searchingIn LIKE lookingFor
</DefiningExpression>
</Function>
到此標簽中的EDMX:
EDMX:EDMX / EDMX:運行/ EDMX:ConceptualModels /架構
還要記住<schema namespace="" />
屬性中的<schema namespace="" />
然后在上面的命名空間中添加一個擴展類:
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");
}
}
此擴展方法現在將映射到EDMX功能。
更多信息: http : //jendaperl.blogspot.be/2011/02/like-in-linq-to-entities.html
“信”是個字母嗎? 如果你把它變成了一個字符串,會發生什么?
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))
也許這更有效率?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.