簡體   English   中英

linq給實體生成了sql

[英]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問題。

一個可能的改進領域:確保您已將要搜索的列編入索引。

alt text http://download.binaryocean.com/plan1.gif

alt text http://download.binaryocean.com/plan2.gif

哇,這是一個真正奇怪的方式! 請注意,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM