我将如何在LINQ2SQL中编写这个?

时间:2010-07-07 17:07:20

标签: c# asp.net sql linq linq-to-sql

我正在慢慢移植一个来自MySQL的应用程序以使用Linq2Sql - 但是有一个查询让我感到困惑。

  

SELECT * FROM Pages WHERE DomainID = @reportid AND(PageContent REGEXP'display:[\ t] * none')> 0 ORDER BY URL ASC

关于如何使用Linq2SQL编写类似内容的任何想法?它的REGEXP位让我难倒?

2 个答案:

答案 0 :(得分:5)

LINQ to SQL无法内置,但您还有其他几种选择。第一个是load your strings in as in-memory objects which you can apply Regex functions to。我不是很喜欢这个,因为看起来你可能会得到一些非常大的字符串来匹配。

第二个选项是利用SQL CLR as described here。这有效地允许您创建一个链接到您创建的CLR方法的存储过程。每当在LINQ to SQL上下文中调用该方法时,它都会转换为存储过程调用。然后你使用这样的查询:

var q = from p in context.Pages
        where p.DomainId == reportId && 
              RegExMatch(p.PageContent, "display\:[ \t]*none")
        select p;

答案 1 :(得分:1)

为什么不使用LINQ返回与reportid匹配且包含'display:'的项目,以最小化从服务器返回的数据量,然后在客户端使用正则表达式来过滤该列表?

var query = Pages.Where( p => p.DomainId == 1 && p.PageContent.IndexOf("display:") > 0).OrderBy( o => o.URL );

var regex = new Regex(@"display\:[\t]*none");

foreach (var page in query)
{
    if( regex.IsMatch(page.PageContent) )
    {
        // Do whatever...                    
    }                    
}