【问题标题】:How Would I Write This In LINQ2SQL?我将如何在 LINQ2SQL 中编写这个?
【发布时间】:2011-03-12 22:43:11
【问题描述】:

我正在慢慢地从 MySQL 移植一个应用程序以使用 Linq2Sql - 但是一个查询让我有点难过。

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

关于如何使用 Linq2SQL 编写这样的东西有什么想法吗?它的 REGEXP 位让我难住了?

【问题讨论】:

  • 所以如果我理解正确,它正在寻找一个不包含“隐藏”内容的页面(即页面中没有任何内容显示display:none,在':之间有零个或多个空格或制表符: '和'无'?

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


【解决方案1】:

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,如果需要正则表达式部分,那么 CLR 存储过程可能是要走的路。
【解决方案2】:

为什么不使用 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...                    
    }                    
}

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 2020-12-05
    • 2020-09-07
    • 2023-03-08
    • 2015-10-19
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多