2010-06-09 67 views
1

这里是我的数据集:奇怪的LINQ to SQL行为

1 David 
2 David 
3 Marc 
4 Marc 
5 Marc 
6 Marc 
7 Marc 
8 Marc 
9 Marc 
10 Marc 
11 Marc 
12 Marc 
13 Marc 
14 Marc 
15 Marc 

该查询返回2条记录(正确):

query = query.Where(Log => SqlMethods.Like 
(Log.FormattedMessage, "%<key>Name</key><value>David</value>%")); 

该查询返回2条记录(正确):

query = query.Where(Log => SqlMethods.Like 
(Log.FormattedMessage, "%<key>Name</key><value>%David%</value>%")); 

该查询返回0条记录(正确):

query = query.Where(Log => SqlMethods.Like 
(Log.FormattedMessage, "%<key>Name</key><value>av</value>%")); 

该查询返回2条记录(正确):

query = query.Where(Log => SqlMethods.Like 
(Log.FormattedMessage, "%<key>Name</key><value>%av%</value>%")); 

该查询返回0的记录(正确):

query = query.Where(Log => SqlMethods.Like 
(Log.FormattedMessage, "%<key>Name</key><value>v</value>%")); 

该查询返回15条记录(不正确的,应该返回2):

query = query.Where(Log => SqlMethods.Like 
(Log.FormattedMessage, "%<key>Name</key><value>%v%</value>%")); 

最后一个查询有什么问题?这是一个错误还是我错过了什么?

+1

如果我们知道您想要匹配的数据会有所帮助。 – Robaticus 2010-06-09 14:23:24

+0

好主意,只是添加它。 – mcass20 2010-06-09 14:25:42

回答

2
"%<key>Name</key><value>%v%</value>%" 

键/值之前/之后是什么?举例来说,我能想象这种匹配是:

<关键>名称< /键> <价值>斯坦< /价值> < v ALUE >凯尔< /价值>

+0

好点!我想你可能会做些什么!现在使用你的数据例子和我的查询结构,你将如何查询“tan”以便它返回该记录? – mcass20 2010-06-09 14:38:59

+0

@mcass:我不确定你在问什么 - 如果你问如何用LIKE查询解析XML,[你不能](http://stackoverflow.com/questions/1732348/regex-match-开放式标签,除了-XHTML-自足标签)。真的,你想要做的是在代码中解析XML,并将数据存储在数据库中,这意味着要存储 - 使用行/列。如果你真的必须尝试在SQL中解析XML,SQL Server有一些[基本支持](http://msdn.microsoft.com/en-us/library/ms345117%28SQL.90%29.aspx),尽管无法从L2S间接访问。 – 2010-06-09 14:56:18

+0

这正是我想要做的。当我们试图将一堆XML填充到SQL字段时,我们挖了一个大洞。这是我们对EntLib日志记录应用程序块的“FormattedMessage”字段的解决方案。这让数据变回原样令人头疼!感谢您节省时间和尝试的痛苦。 – mcass20 2010-06-09 15:15:54

0

我能看到的唯一原因是,你有%v%作为过滤器,这意味着在正则表达式(。+)v(。+)中,基本上任何值都与其中的某个v有关。如果这不是解决方案,您可以发布查询结果吗?

+0

我很感谢你的反馈,但你并没有解决整个过滤器问题。它不只是“%v%”,其“%名称%v%%”。此外,只有2条记录中包含“v”。 – mcass20 2010-06-09 13:52:31