2011-07-18 13 views
-1

次のコードは動作しません。 PartitionKeyとRowKeyの値を解決することはできません。私はそこにいくつかの専門家が私にいくつかのアドバイスを与えることができることを願っています。私がこれまでにしてきたことは、いくつかの提案に基づいていますが、まだ動作していません。以下はCでのジェネリックと述語#

public class BaseTable 
{ 
    public string PartitionKey { get; set; } 
    public string RowKey { get; set; } 
} 

public abstract class AzureTableBase<T> : IAzureTable<T> 
    { 

    // This method gives the errors. The idea of this method is that instead of 
    // supplying the predicate you can just supply a value for partitionkey and 
    // rowkey as parameters. The problem is that it doesn't work and give the 
    // following syntax errors: 
    // 
    // Cannot resolve symbol PartitionKey 
    // Cannot resolve symbol RowKey 
    public virtual T Get<T>(string pkey, string rkey) where T : BaseTable 
    { 
     var a = this.Query.Where(u => u.PartitionKey == pkey && u.RowKey == rkey); 
    } 

    // Following method works: 
    public virtual T Get(Expression<Func<T, bool>> predicate) 
    { 
     return this.Query.Where(predicate).FirstOrDefault(); 
    } 

    public virtual IQueryable<T> Query 
    { 
     get 
     { 
      TableServiceContext context = CreateContext(); 
      return context.CreateQuery<T>(TableName).AsTableServiceQuery(); 
     } 
    } 

} 

私は現在、二Get関数を呼び出す方法の例です:

SubTest = testTable.Get(u => u.PartitionKey == "XX" & u.RowKey == "YY") 

私がしたいことは、このようにそれを呼び出すことができるようにすることです:

SubTest = testTable.Get("XX","YY") 
+1

実際のエラーメッセージが参考になります。それ以上の情報なしで言うのは難しいです。バットを外してみると、問題を引き起こしていると思われるものとして、「this.Query」のタイプが何であるのだろうかと思います。 – asawyer

+0

「これ」とは何ですか? 「取得」はBaseTableのメソッドですか? –

+0

これは、IEnumerable として定義されていますか? –

答えて

0

これは、たぶんIQueryable

this.Query.Where(u => u.PartitionKey == pkey && u.RowKey == rkey); 

メソッドはの値を返すとしています。この場合、値はBaseTable(場合によってはサブクラス)に制限されています。これら2つのタイプは互換性がありません。

+0

更なる情報で更新された質問 – MIMI

+0

'BaseTable'が他のものから継承しないクラスの場合、これは書かれているように動作する祈りではありません。 – Yuck

+0

これは、stackoverflowの他のメンバーからの提案の後に追加されました。彼らは、そのクラスをPartitionKeyとRowKeyのメンバーと一緒に配置すると、エラーは発生しないことを提案しました。私は他の提案にも開放しています。そこにTableServiceEntityクラスを配置することも提案されました。いずれにしても、構文エラーを止めるのにはまだ役立たない。ありがとう – MIMI

2

これがあなたの正確なコードであれば、フリーフローティング機能を持つことはできません。Get<T>をクラスに入れてください。クラスには、好ましくはQueryのソートフィールドがあります。

更新された投稿と完全なコードの投稿を完全に拒否したことに基づいて、あなたのコードが本当に気にしない(または理解する)ことはできないと思います。そのノートには、

public abstract class AzureTableBase<T> : IAzureTable<T> where T : BaseTable 
{ 
    // don't need to re-generalize this function, T is already inherited from your class 
    public virtual T Get(string pkey, string rkey) 
    { 
     var a = this.Query.Where(u => u.PartitionKey == pkey && u.RowKey == rkey); 
     return a.FirstOrDefault();  // again, only guessing. 
    } 

    public virtual IQueryable<T> Query 
    { 
     get 
     { 
      TableServiceContext context = CreateContext(); 
      return context.CreateQuery<T>(TableName).AsTableServiceQuery(); 
     } 
    } 
} 
+0

私は質問を更新しました。ありがとう。 – MIMI

+0

@MIMI、あなたはいませんでしたが、依然として 'Query'が何を想定しているのかは言及していません。 – Blindy

+0

申し訳ありません。更新しましたが、あなたの質問に直接更新しませんでした。私はちょうど私があなたが求めていたと思ったものを加えました。 Thanks – MIMI

0

@Blindlyは正しいですが、1つの他の作品はあり... context.CreateQuery<T>(TableName).AsTableServiceQuery();によって、Tまたはタイプのリターンは、実際にBASETABLEから継承していますか?

class OneOfYourTables : BaseTable 
{ 

} 

それは、それはあなたの問題ではありません場合。

関連する問題