(。NET 3.5 SP1,VS 2008,VB.NET,MSSQL Server 2008)
我正在编写一个小型网络应用程序来测试高棉语Unicode和老挝语。我有一个表格,用Khmer Unicode存储文本,结构如下:
[t_id] [int] IDENTITY(1,1) NOT NULL
[t_chid] [int] NOT NULL
[t_vn] [int] NOT NULL
[t_v] [nvarchar](max) NOT NULL
我可以使用Linq to SQL正常执行CRUD。即使我没有更改MSSQL Server 2008的默认排序规则,文本也会在网页上正确显示。
在搜索列[t_v]时,页面将需要很长时间才能加载,实际上,它会加载该列的每一行。它永远不会与我用于搜索的“关键词”标准相比。这是我对搜索的查询:
Public Shared Function SearchTestingKhmerTable(ByVal keyword As String) As DataTable
Dim db As New BibleDataClassesDataContext()
Dim query = From b In db.khmer_books _
From ch In db.khmer_chapters _
From v In db.testing_khmers _
Where v.t_v.Contains(keyword) And ch.kh_book_id = b.kh_b_id And v.t_chid = ch.kh_ch_id _
Select b.kh_b_id, b.kh_b_title, ch.kh_ch_id, ch.kh_ch_number, v.t_id, v.t_vn, v.t_v
Dim dtDataTableOne = New DataTable("dtOne")
dtDataTableOne.Columns.Add("bid", GetType(Integer))
dtDataTableOne.Columns.Add("btitle", GetType(String))
dtDataTableOne.Columns.Add("chid", GetType(Integer))
dtDataTableOne.Columns.Add("chn", GetType(Integer))
dtDataTableOne.Columns.Add("vid", GetType(Integer))
dtDataTableOne.Columns.Add("vn", GetType(Integer))
dtDataTableOne.Columns.Add("verse", GetType(String))
For Each r In query
dtDataTableOne.Rows.Add(New Object() {r.kh_b_id, r.kh_b_title, r.kh_ch_id, r.kh_ch_number, r.t_id, r.t_vn, r.t_v})
Next
Return dtDataTableOne
End Function
请注意,我使用与Lao Unicode完全相同的代码和数据库设计,它工作得很好。我得到了预期的搜索返回查询。
我无法弄清楚在高棉语表中搜索查询有什么问题。
我使用以下Linq加入表:
Dim query = From b In db.khmer_books _
Join ch In db.khmer_chapters On b.kh_b_id Equals ch.kh_book_id _
Join v In db.testing_khmers On ch.kh_ch_id Equals v.t_chid _
Where v.t_v.Contains(keyword) _
Select b.kh_b_id, b.kh_b_title, ch.kh_ch_id, ch.kh_ch_number, v.t_id, v.t_vn, v.t_v
但我仍然从该表中获得了所有行。任何的想法 ?非常感谢。
答案 0 :(得分:0)
我很慢;问题是(我认为)加入;你有导航属性吗?你应该能够使用像
这样的东西 from book in db.Books
from chapter in book.Chapters
from verse in chapter.Verses
等 - 或(最坏情况)使用LINQ join
语法。我认为这将比复合WHERE
明显更好;像这样:
From b In db.khmer_books
Join ch In db.khmer_chapters On b.kh_b_id Equals ch.kh_book_id Into ch
Join v In db.testing_khmers On ch.kh_ch_id Equals v.t_chid Into v
Where v.t_v.Contains(keyword)
{your select}
原:
首先要做的是获取生成的查询;您可以在运行查询之前分配db.Log = Console.Out
,这会将TSQL推送到控制台(或者您可以使用任何其他TextWriter
)。我很想知道它产生了什么......
然后,您可以在数据库(管理工作室)测试这个TSQL,看看它是如此可怕的错误。
在最坏的情况下,您可以编写UDF来执行搜索(使用固定的TSQL),并从LINQ-to-SQL调用它。
你能发布TSQL吗?
答案 1 :(得分:0)
这是我从SqlServerQueryVisualizer获得的TSQL:
SELECT [t0].[kh_b_id], [t0].[kh_b_title], [t1].[kh_ch_id], [t1].[kh_ch_number], [t2].[t_id], [t2].[t_vn], [t2].[t_v]
FROM [dbo].[khmer_book] AS [t0], [dbo].[khmer_chapter] AS [t1], [dbo].[testing_khmer] AS [t2]
WHERE ([t2].[t_v] LIKE '%ដាវីឌ%') AND ([t1].[kh_book_id] = [t0].[kh_b_id]) AND ([t2].[t_chid] = [t1].[kh_ch_id])
我在管理工作室运行这个,即使表中有ដាវីឌ,我也没有得到任何东西。