2017-11-30 7 views
-1

その後、私は[LINQのは私がダイナミックのソースタイプで、この(「クエリ式を行うことができません、そのオブジェクトに使用LINQ動的オブジェクトを照会する

int id = 123; 
    dynamic b = 
    Convert.ChangeType(dataToCompareTo, Type.GetType(tableName)); 

var values = (from item in (b) 
       where item.Id == id 
       select item).FirstOrDefault(); 

を照会したいです..]は許可されません ")。私は実行時の前にオブジェクトの型を知らない。

+3

'dynamic b ='を 'var b ='で変更した場合、それを試してみましたか? – MethodMan

+1

@MethodManどうすればそれが役に立ちますか? bはlinq式では使用できないオブジェクトになります。IEnumerableを期待しています –

+0

オペレーションはそのオブジェクトを '(IEnumerable)'が次の推測となるようにキャストする必要があります – MethodMan

答えて

3

dynamicここで使用するのは間違っています。 ChangeTypeの戻り値の型はobjectです。コンパイラがコンパイル時にどのような型になるかを知ることは不可能です。 bvarと定義した場合、コンパイラはをobjectとみなし、それ以上は何も知らないでしょう。

あなたのLINQ式は、IEnumerable、おそらくはIEnumerable<SomeType>を実装する特定のタイプを予期しているようです。その場合は、次のタイプにキャストする必要があります。

int id = 123; 
var b = 
Convert.ChangeType(dataToCompareTo, Type.GetType(tableName)); 

IEnumerable<SomeType> c = b as IEnumerable<SomeType>; 
if (c == null) 
{ 
    ///this is where you handle the objects that aren't what you need them to be for the linq expression below 
} 
else 
{ 
    var values = (from item in (c) 
      where item.Id == id 
      select item).FirstOrDefault(); 
} 
+0

..困っています私は私のインポートデータを取得するまで私は型を知らないxml – hWright

+0

それではキャストを試みなければならず、失敗した場合は何か他のことをしなければなりません。私は私の答えを更新しました –

+0

なぜdownvoteしてください? –

1

ダイナミックを使用する場合は、ここで実行できます。あなたはb変数がId性質を持っていますが、インターフェイスを使用することができない、そして何らかの理由がわからない、いくつかの種類のリストであることを知っているとします

public class SomethingWithId { 
    public int Id { get; set; } 
} 
// you have no idea what that is at runtime 
object something = new List<SomethingWithId>() {new SomethingWithId() {Id = id}}; 

その後、あなたはこのようなdynamic使用することができます。

object something = new List<SomethingWithId>() {new SomethingWithId() {Id = id}}; 
// cast to `IEnumerable<dynamic>`, this will always compile 
// but of course might fail at runtime, as always with dynamic 
// in your case that is (IEnumerable<dynamic>) Convert.ChangeType(dataToCompareTo, Type.GetType(tableName)); 
var b = (IEnumerable<dynamic>) something; 
// run your query 
var values = (from item in b 
     where item.Id == id 
     select item).FirstOrDefault(); 

これは、C#でそのようなことを行うのに慣れていないと言いました。強く型付けされたlangugeであり、それによってもたらされる利点を無視してはいけません。

+0

私は動的キーワードを使うのが良いことはまだありません。 –

+0

@TimRutter自分でも使っていません。 – Evk

関連する問題