2012-02-20 10 views
2

Webサービスで文字列としてGUIDを渡そうとしていますが、路面ではバンプが発生しました。 GUIDはUNIQUEIDENTIFIERとしてSQL Serverに格納され、EFはGUIDとしてプルします。GUIDをエンティティフレームワークを使用した文字列に変換する

var query = myEntities.Foo.Where(q => q.Id== Id) 
       .Select(bar => 
         new Bar() 
          { BString = bar.GUID } 
         ); 

さて、C#は、あなたがstringSystem.Guidを変換することができないビルドエラーがスローされますので、私はあなたがこれを行うことができると思うだろう:

{ BString = bar.GUID.ToString() } 
私は何をしたいと思うことは、これを行う私のクエリであります

あるいは

{ BString = Convert.ToString(bar.GUID) } 

しかし、実行時例外と両端:

例外がありました。System.NotSupportedExceptionでした:LINQ to エンティティが 'System.String ToString(System.Object)'メソッドのメソッドを認識せず、このメソッドをストア式に変換することはできません。

だから私は両方のケースで、それはUniqueIdentifierからvarcharに行くのT-SQLの同等を把握することができないことを集めます。

オブジェクトを取得するだけでなく、各オブジェクトを新しいオブジェクトにコピーして、その時点でguid-> stringを変換する私のリターンセットを反復する方法がありますか?

ありがとうございました。

+0

これは回避策です。バータイプにGuidを文字列として返すプロパティがある場合、Linqクエリでこのプロパティを使用してください – Beatles1692

+0

ラムダステートメントが実行された後のクエリの値は何ですか? – MethodMan

答えて

6

文字列に変換する LINQステートメントのクエリ部分。

var query = myEntities.Foo.Where(q => q.Id== Id).Select(r => r.GUID) 
    .AsEnumerable() 
    .Select(guid => 
    new Bar() 
    { BString = guid.ToString() } 
); 

.AsEnumerable()は重要な部分である:それは、データベースのクエリが行われた後、クライアント上の任意の更なる操作を実行する効果を持つ、IQueryableからIEnumerableに結果をキャストします。 (また、その場所に.ToArray()または.ToList()を使用することができます。)

+0

ありがとうございます、私はパフォーマンステストのチャンスを得るまで、あなたが持っている2番目のクエリで作業します。さもなければ、私は、Zrutyが言及していたようなsprocのようなものに交換しなければならないかもしれない。 – Dio

0

をパフォーマンスが懸念されていない場合、あなた自身を示唆したように、あなたはおそらく、手動で文字列にあなたのGUIDを再マップする必要があります。

var query = from entity in myEntities.Foo 
      where entity.Id == Id 
      select new { GUID = entity.GUID }; 
var response = from item in query.ToList() 
       select new Bar { BString = item.GUID } 

これを@Tim Rogersの示唆に似ていますが、明示的に2つのクエリに分割されています。

T-SQLのネイティブconvert()ステートメントを使用して、GUIDを文字列に変換するストアドプロシージャを作成する方法もあります。これは、EFが文字列にGUIDを自動的にマップできないことを回避します。