2

我有以下 linq 到实体查询

Dim results = (From t In ctx.events
               Where t.date >= dStartDate.Date And t.date <= dEndDate.Date
               Order By t.time
               Select New With {
                   t.symbol,
                   t.date, t.time,
                   t.description,
                   t.domestic_call_num,
                   t.web_url}).ToList()

我想限制返回结果,以便我只得到 t.symbol 的值中不包含数字的结果。我不确定如何做到这一点,因为我尝试过的方法不起作用

4

2 回答 2

2

其值中不包含数字

假设你的意思是:

  1. symbol是一个字符串。
  2. 包含一个数字字符。

然后,如果这是在客户端上完成的)一个简单的正则表达式就可以了:

Dim results = (From t In ctx.events
               Where t.date >= dStartDate.Date And t.date <= dEndDate.Date
               Where Not Regex.IsMatch(t.symbol, "\d")
               Order By t.time
               Select New With {
                 t.symbol,
                 t.date, t.time,
                 t.description,
                 t.domestic_call_num,
                 t.web_url
              }).ToList()

但是,这不太可能(EF 提供程序可以实现正则表达式)在客户端工作。接受一组特定的数字(例如,只是西方语言的阿拉伯数字)会使问题变得更容易:请参阅其他答案

服务器上更通用的解决方案可能取决于您正在使用的提供程序的函数(或实体 SQL)的详细信息。除非将过滤掉如此大比例的行以产生影响(要传输更多数据),否则混合解决方案是可能的。在服务器上尽可能多地进行过滤,然后在本地执行其余的过滤(如果我的 VB 语法正确的话):

Dim results = (from s in (
                 From t In ctx.events
                 Where t.date >= dStartDate.Date And t.date <= dEndDate.Date
                 Order By t.time
                 Select New With {
                   t.symbol,
                   t.date, t.time,
                   t.description,
                   t.domestic_call_num,
                   t.web_url
                 }).ToEnumerable()
               Where Not Regex.IsMatch(s.symbol, "\d")
               Select s
              ).ToList()
于 2013-06-04T08:31:25.807 回答
0

您可以创建带有数字的字符串数组,并简单地检查符号是否包含任何数字。这是 C# 解决方案(适用于 EF)

var digits = "1 2 3 4 5 6 7 8 9 0".Split();
var result = from t in ctx.events
             where t.date >= dStartDate.Date && 
                   t.date <= dEndDate.Date &&
                   !digits.Any(d => t.symbol.Contains(d))
             orderby t.time
             select new {
               t.symbol, t.date, 
               t.time, t.description,
               t.domestic_call_num,
               t.web_url };

我相信 VB 代码会是这样的:

Dim digits = "1 2 3 4 5 6 7 8 9 0".Split()
Dim result = From t In ctx.events 
             Where t.[date] >= dStartDate.[Date] AndAlso t.[date] <= dEndDate.[Date] AndAlso Not digits.Any(Function(d) t.symbol.Contains(d))
             Order By t.timeNew From { _
                t.symbol, _
                t.[date], _
                t.time, _
                t.description, _
                t.domestic_call_num, _
                t.web_url _
            }
于 2013-06-04T08:55:05.353 回答