1

让我们从将用于过滤结果的字符串列表开始:

 List<String> RadioNames = new List<String>();
 RadioNames.AddRange(new String[] { "abc", "123", "cba", "321" });

我希望能够过滤一个 LINQ to SQL 数据库表,RadioNames但问题是我想要RadioNames部分匹配(这意味着它将捕获 Radio123 而不仅仅是 123)。

我需要过滤的来源如下:

var ChannelGrants = from cg in sddc.ChannelGrants
                    select new
                    {
                        cg.ID,
                        cg.Timestamp,
                        cg.RadioID,
                        cg.Radio
                    };

所以我需要执行类似于下面的操作(在原始ChannelGrants结果之外,因为这是一个条件搜索)

 if(RadioNamesToSearch != null)
 {
      List<String> RadioNames = new List<String>();

      // Here I split all the radio names from RadioNamesToSearch based on a command separator and then populate RadioNames with the results

      ChannelGrants = from cg in ChannelGrants
                      where ???
                      select cg;
 }

我需要帮助在哪里???在上面的代码中(或者如果ChannelGrants = ...一起无效)。重复以上步骤,我需要过滤ChannelGrants以返回任何匹配项,RadioNames但它会进行部分匹配(这意味着它将捕获 Radio123 而不仅仅是 123)。

所有代码都包含在这样的方法中......

 public static DataTable getBrowseChannelGrants(int Count = 300, String StartDate = null, String StartTime = null, String EndDate = null, String EndTime = null, String RadioIDs = null, String RadioNamesToSearch = null, String TalkgroupIDs = null, String TalkgroupNames = null, bool SortAsc = false)
4

3 回答 3

0

您将 RadioNames 与 ChannelGrants 中的哪个字段进行比较?

要检索仅在 RadioNames 列表中的条目,您可以使用 contains 方法,如下所示

ChannelGrants = from cg in ChannelGrants
                  where RadioNames.Contains(cg.Radio)
                  select cg;

(如果您想在 Radio 属性中查找具有 RadioNames 之一的所有行。将 cg.Radio 替换为您匹配的相应列)

如果你在 SQL 中有这个 where 子句,这会给你类似的结果

where cg.Radio in ("abc", "123", "cba", "321")

从此链接如何在 Linq 中执行 SQL Like %? 看起来你也可以将它与类似的匹配组合起来,但是添加斜线,这不是我个人做过的事情。

于 2012-06-06T23:49:40.380 回答
0

目前,似乎没有最好的方法,所以我会回答这个问题,直到一个新的答案不重复在这个线程上不起作用的其他答案。

于 2012-07-03T19:30:43.963 回答
0

代替???

RadioNames.Where(rn=>cg.Radio.ToLower().Contains(rn.ToLower())).Count() > 0

应该这样做...

当然,ToLower() 调用是可选的。

编辑:我刚刚写了这个,它在控制台应用程序中对我来说很好。结果包含一项,WriteLine 吐出“cbaKentucky”。不知道该告诉你什么。

class Program
{
    static void Main(string[] args)
    {
        List<String> RadioNames = new List<String>();
        RadioNames.AddRange(new String[] { "abc", "123", "cba", "321" });

        List<ChannelGrants> grants = new List<ChannelGrants>();
        grants.Add(new ChannelGrants() { ID = 1, Radio = "cbaKentucky", RadioID = 1, TimeStamp = DateTime.Now });

        var result = from cg in grants
                  where RadioNames.Where(rn=>cg.Radio.ToLower().Contains(rn.ToLower())).Count() > 0
                  select cg;

        foreach (ChannelGrants s in result)
        {
            Console.WriteLine(s.Radio);
        }
    }
}

class ChannelGrants
{
    public int ID { get; set; }
    public DateTime TimeStamp { get; set; }
    public int RadioID { get; set; }
    public string Radio { get; set; }
}
于 2012-06-06T23:04:27.177 回答