2012-01-05 3 views
0

シナリオの解決策としてダイナミックLINQを試しています。これにより、ユーザーは「ダイナミックLINQ」に基づいて一連のファイルを選択できる必要があります。タグ "に割り当てられています。例えば。ダイナミックLINQを使用して異なるオブジェクトタイプの式を同時に照会する方法

File A - tagged as "a", 
File B - tagged as "b", 
File C - tagged as "c", 
File D - tagged as "d" and "a" 

だから私は「A」としてタグ付けされたすべてのファイルを検索したい場合は、私のように入力します。

tag = "a" 

私は、ファイルAとファイルdになるだろう。しかし、私はまた

tag = "a" OR tag = "b" 

は、だから私は、ファイルを取得するでしょう入力することができ、BとD

これだけの例では、道であります!

ので、このシナリオを考えると、私は次のコードを使用することによって、これを達成することができる午前:

List<FileMeta.Filetag> tags = fetchAllTags(file); //this fetches the tags from the file and places them in a list 
      if (tags != null) //just in case 
      { 
       //declare the type of parameter we are looking for - in this case a "tag" 
       var p = Expression.Parameter(typeof(string), "Tag"); 
       //setup the lambda parser to accept the param type, and use the expression 
       var z = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, equation); 

       //for each tag in this file 
       foreach (FileMeta.Filetag t in tags) 
       { 
        //if it hasn't been found yet 
        if (!bFound) 
        { 
         bFound = (bool)z.Compile().DynamicInvoke(t.tag); 
        } 
       } 
      } 

は、だからここに私は、ファイルからタグを取得し、それらが果たすかどうかを確認するためにそれらを列挙しています等式が入力されました。これは問題なくOKです。

私が問題があるのは、次のような状況です。

これらのファイルの「タグ」は、実際にはファイルの代替ストリーム情報に格納され、ファイルに関する事実上の「メタ」情報であるその他の情報も格納されます。ファイルには1つ以上のメタ情報が含まれている場合があります。このため、すべてが型指定されたオブジェクトからのXMLデータとしてファイルを持つ単一のストリームにシリアル化されます。上記のコードのListがFileMeta.Filetag型であることに気づいたかもしれません。すべてのオブジェクトは、Filemetabaseオブジェクトという基本オブジェクトから継承します。

私が頭を上げられないのは、別のタイプのオブジェクトを見たい場合です。 Filtateオブジェクトは、Filetagオブジェクトと同時に、Dynamic LINQで基本型(Filemetabaseオブジェクト)の各オブジェクトを渡して何らかのキャストを行うことが可能ですか?

私は、完璧なシナリオでは、このメタ情報をたとえばtag = "a" AND date = "01/01/2012"ですが、問題は「タグ」がFileTagオブジェクトにあり、「日付」がFiledateオブジェクトに明白にプロパティとして存在することです:例えば簡単なシナリオでは:

public class Filemetabaseobject 
{ 

} 
public class Filetag : Filemetabaseobject 
    { 
     public string tag { get; set; } 
    } 
public class Filedate : Filemetabaseobject 
{ 
    public string date { get; set; } 
} 

解決方法はありますか?

ありがとうございます!

(tag = "a" AND tag = "b")OR tag = "c"のようなタイプのクエリを入力することができます。 a "AND tag =" b "AND tag =" c ")とする。あなたは、すべての子クラスでそれをオーバーライドし、あなたのFileMetabaseObjectValueという抽象読み取り専用の文字列プロパティを与えることができる

答えて

0

上記のsq33Gが、値プロパティを公開する抽象クラスを持っていることに関して、私はこれを解決することができました。

基本的に、すべてのタイプ(タグを含む)がFilemetabaseobjectから継承され、 "value"というオーバーライド可能なプロパティを持ち、検索のために公開したいものに設定されている場合、継承したオブジェクトから取得値を設定して、そのオブジェクトが見つかるようにします。

次に、Dynamic LINQ ParseLambdaメソッドの次の実装を使用すると、継承したオブジェクト型を基本クラスのように渡すことができます。継承されたオブジェクト型を継承することができますオーバーライドされたプロパティ:

//If we pass in type of filemetabaseobject, because all file metas inherit from it, and we have exposed an overridde property of "value" to all objects, we can just consult that on all types (where lequation is the string representing the equation): 
var z = System.Linq.Dynamic.DynamicExpression.ParseLambda(typeof(FileMeta.Filemetabaseobject), typeof(bool), lequation); 
//invoke the query - true will be returned if the query is valid against the property(ies) exposes 
bFound = (bool)z.Compile().DynamicInvoke(t); //where t is my filetag that I'm querying against, but could be anything that inherits from filemetabaseobject 
0

public abstract class FileMetabaseObject { 
    public abstract string Value { get; } 
} 

public class FileTag : FileMetabaseObject { 
    public string Tag { get; set; } 
    public override string Value { get { return Tag; } } 
} 

次に、あなたは

List<Func<FileMetabaseObject,bool>> whereClauses = 
    new List<Func<FileMetabaseObject,bool>> { 
     m => m.Value == "foo", 
     m => m.Value == DateTime.Today.ToShortDateString() }; 

bool meetsCriteria = whereClauses. 
    All(criteria => fileMetadataColl. 
     Any(meta => criteria(meta)); 

を未使用することができますLinqがここでどのように役立つのかがはっきりしています。

+0

提案ありがとうございました。説明するために、Dynamic LINQに着手した理由は、この問題の解決策を見ているときに、UIにコードを書くのを効果的に試みるときに、上記と同様のことを行った人からのいくつかの投稿に出会ったからですアプリケーション内で実行されます。私が持っている問題は、ユーザーによってUIにクエリが書き込まれるということです。これを見ると、これを式としてDynamic LINQに渡してクエリを実行(実行)することができます。上記の例では、1つのタグと1つの日付だけを検索するように制限されると思います。 – wyerarch

+0

@wyerarch私が誤解していない限り、あなたが必要とするもののためにパフォーマンスが重く聞こえます。 – sq33G

関連する問題