2012-01-23 7 views
0

次のコードは、動的オブジェクトのEnumerableを返します。FirstOrDefaultの動的オブジェクトのリストを照会

protected override dynamic Get(int id) 
{ 
    Func<dynamic, bool> check = x => x.ID == id; 
    return Enumerable.Where<dynamic>(this.Get(), check); 
} 

は、どのように私はそれが単一のオブジェクトが列挙ではありませんFirstOrDefaultを選択しますか?

this answerと似ていますが、単なるSingleOrDefaultが必要です。

答えて

2

最も簡単な方法はおそらく一部の人々はあなたが3.5から変換する場合(新しい.NET 4.0コンソールプロジェクトを行うだけでテストするためのトラブル、この作業を行うことがあったので

protected override dynamic Get(int id) 
{ 
    return Get().FirstOrDefault(x=>x.ID==id); 
} 

ありますSystem.CoreとMicrosoft.CSharp参照を追加する必要があります)、これをProgram.csに貼り付けます。私がテストした3台のマシンで問題なくコンパイルして実行します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Dynamic; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     protected dynamic Get2(int id) 
     { 
      Func<dynamic, bool> check = x => x.ID == id; 
      return Enumerable.FirstOrDefault<dynamic>(this.Get(), check); 
     } 

     protected dynamic Get(int id) 
     { 
      return Get().FirstOrDefault(x => x.ID == id); 
     } 

     internal IEnumerable<dynamic> Get() 
     { 
      dynamic a = new ExpandoObject(); a.ID = 1; 
      dynamic b = new ExpandoObject(); b.ID = 2; 
      dynamic c = new ExpandoObject(); c.ID = 3; 
      return new[] { a, b, c }; 
     } 

     static void Main(string[] args) 
     { 
      var program = new Program(); 
      Console.WriteLine(program.Get(2).ID); 
      Console.WriteLine(program.Get2(2).ID); 
     } 

    } 

} 
+1

コンパイル時にエラーが発生する "ラムダ式を、デリゲートまたは式ツリータイプにキャストしなくても、動的ディスパッチ処理の引数として使用することはできません" – eiu165

+0

@ eui165 .NET 4.0を実行していないと思いますか?私が受け入れられた答えに上記で尋ねたように、Funcは古いDLRの回避策かもしれません。 –

+0

私はここから完全に外れているかもしれません。私はあなたの答えがより良く書かれた方法が好きです。しかし、私はプロジェクトのプロパティを見ていて、ターゲットフレームワークは.Net Framework 4です。まだコンパイル時エラーが出ます。 – eiu165

0

ちょうどいいですか?

protected override dynamic Get(int id) 
{ 
    Func<dynamic, bool> check = x => x.ID == id; 
    return Enumerable.Where<dynamic>(this.Get(), check).FirstOrDefault(); 
} 
3

あなたはFirstOrDefaultの代わりWhereとあなたのコードを使用することができます。このように:

protected override dynamic Get(int id) 
{ 
    Func<dynamic, bool> check = x => x.ID == id; 
    return Enumerable.FirstOrDefault<dynamic>(this.Get(), check); 
} 
+0

なぜFuncのステップですか?古いDLRの回避策? –

+0

私たちがダイナミクスのリストを照会しているので、そのようなxはありません.ID – eiu165

+0

@ eiu165私の答えを下に見て、コンパイルし、.NET 4.0(VS2010)で正常に動作し、Funcを使用しません。 –

関連する問題