1

結果のフィルタリングに使用される文字列のリストから始めましょう。

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

に基づいてLINQtoSQLデータベーステーブルをフィルタリングできるようにしたいのですRadioNamesが、キャッチはRadioNames部分一致になりたいということです(つまり、123だけでなくRadio123もキャッチします)。

フィルタリングする必要のあるソースは次のとおりです。

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ますが、部分一致を実行します(つまり、123だけでなくRadio123もキャッチします)。

すべてのコードは、そのようなメソッドに含まれています...

 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プロパティにRadioNameの1つが含まれるすべての行を検索する場合は、cg.Radioを一致する適切な列に置き換えます)

これにより、SQLでこのwhere句を使用した場合にも、同様の結果が得られます。

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

このリンクからLinqで%のようなSQLを実行するにはどうすればよいですか? マッチングのように組み合わせることができるように見えますが、スラッシュを追加することは、私が個人的に行ったことではありません。

于 2012-06-06T23:49:40.380 に答える
0

???の代わりに

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

それはそれをする必要があります...

もちろん、ToLower()呼び出しはオプションです。

編集:私はこれを書いたばかりで、コンソールアプリケーションでうまく機能しました。結果には1つのアイテムが含まれ、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 に答える
0

現時点では最善の方法はないようですので、このスレッドで機能しない他の回答を繰り返さない新しい回答が出るまで、これに回答します。

于 2012-07-03T19:30:43.963 に答える