0

オプションの文字列リストをクエリに渡す方法を見つけようとしています。私がやろうとしているのは、それらの間の関係によってタグのリストをフィルタリングすることです。たとえば、c# が選択された場合、私のプログラムは ac# タグを持つドキュメントに表示されるタグのみを提案し、次に SQL などを選択すると、これら 2 つのタグのドキュメントにリンクされているタグが一緒に表示されます。ユーザーが自分の目標にどんどん近づくことができるようにします。

現時点で私が持っているのは次のとおりです。

List<Tag> _tags =  (from t in Tags
                   where t.allocateTagDoc.Count > 0
                   select t).ToList();

これは、タグが選択されたときにオプションの引数を使用して繰り返し呼び出されるメソッドにあります。


私はお尻を後ろに向けてきたと思います。提供されたタグごとに 2 つ (またはそれ以上) のクエリを作成する場合は、それらがすべて一緒に表示されるドキュメントを見つけて、それらに付随するすべてのタグを取り出します...または、データベースでのヒット数が多すぎますか? エンティティ コンテキスト変数を使用して完全に実行し、モデルのクエリを実行することはできますか?

助けてくれてありがとう!

4

3 に答える 3

1

これを試すこともできます。 Dictionary は、タグ付きのドキュメントの ID を表します。

        Dictionary<int, string[]> documents = 
            new Dictionary<int, string[]>();

        documents.Add(1, new string[] { "C#", "SQL", "EF" });
        documents.Add(2, new string[] { "C#", "Interop" });
        documents.Add(3, new string[] { "Javascript", "ASP.NET" });
        documents.Add(4, new string[] { });

        // returns tags belonging to documents with IDs 1, 2
        string[] filterTags = new string[] { "C#" };
        var relatedTags = GetRelatedTags(documents, filterTags);
        Debug.WriteLine(string.Join(",", relatedTags));

        // returns tags belonging to document with ID 1
        filterTags = new string[] { "C#", "SQL" };
        relatedTags = GetRelatedTags(documents, filterTags);
        Debug.WriteLine(string.Join(",", relatedTags));

        // returns tags belonging to all documents 
        // since no filtering tags are specified
        filterTags = new string[] { };
        relatedTags = GetRelatedTags(documents, filterTags);
        Debug.WriteLine(string.Join(",", relatedTags));


    public static string[] GetRelatedTags(
        Dictionary<int, string[]> documents, 
        string[] filterTags)
    {
        var documentsWithFilterTags = documents.Where(o => 
            filterTags
                .Intersect(o.Value).Count() == filterTags.Length);

        string[] relatedTags = new string[0];

        foreach (string[] tags in documentsWithFilterTags.Select(o => o.Value))
            relatedTags = relatedTags
                .Concat(tags)
                .Distinct()
                .ToArray();

        return relatedTags;
    }
于 2012-07-18T08:25:27.260 に答える
0

私が戻って、私が最初に考えていたものとはまったく異なる私の解決策を共有すると思った.

まず、データベースを少し変更して、allocateDocumentTag テーブルの役に立たないフィールドを削除しました。これにより、エンティティ フレームワーク モデルをより効率的に使用できるようになりました。これにより、そのテーブルを省略して、Tag と Document の間の関係だけでアクセスできるようになりました。

初めてフォームに入力するときは、ドキュメントと関係のあるすべてのタグを表示するだけです。その後、検索フィルターを使用して、checkedListBox でタグが選択されると、そのタグに関連付けられているドキュメント ID が返され、フィードバックされて、使用されているタグ リストボックスに入力されます。

public static List<Tag> fillUsed(List<int> docIds = null)
        {
            List<Tag> used = new List<Tag>();

            if (docIds == null || docIds.Count() < 1)
            {
                used = (from t in frmFocus._context.Tags
                        where t.Documents.Count >= 1
                        select t).ToList();  
            }
            else
            {    
                used = (from t in frmFocus._context.Tags
                        where t.Documents.Any(d => docIds.Contains(d.id))
                        select t).ToList();  
            }
            return used;
        }

そこから、タグはドキュメント検索にフィードされ、その逆も同様です。答えが不明な場合、またはさらにコードが必要な場合は、コメントを残してください。並べ替えを試みます。

于 2012-09-14T17:54:25.437 に答える