2017-01-30 3 views
2

エンティティへのLINQでGUIDに文字列をキャストすることはできません:は、次のコードはLinqPadで正常に動作

(from u in AspNetUsers 
    let userOrders = (from uo in UserOrders where uo.UserId == new Guid(u.Id) select uo) 
    select u) 

をしかし、私は私のMVCアプリケーションから、まったく同じコードを実行しようとすると、それは私に次のエラーを与えます:

var users = (from u in ctx.Users 
      let userOrders = (from uo in ctx.UserOrders where uo.UserId == new Guid(u.Id) select uo) 
      select u); 

Only parameterless constructors and initializers are supported in LINQ to Entities.

は私が今までエンティティへのLINQでGUIDに文字列を変換するあらゆる問題を抱えて覚えていません。私はいくつかの参考文献を欠いていますか

は私が考えることができるすべての参照、すでに含まれています:

using System.Linq; 
using System.Data.Entity; 

をなぜそれがLinqPadではなく、MVCで動作しますか?

編集:は奇妙なことに、これが動作しているようです:

あなたはオブジェクトがまだ実現されていないコンテキスト内にある
let userOrders = (from uo in ctx.UserOrders where uo.UserId.ToString() == u.Id select uo) 
+2

'new Guid(u.Id)' <=これを行うことはできません(例外メッセージに記載されています)。 Linq to Objects(メモリ内)を使用していたら、それを行うことはできますが、データストアでは変換できません。 – Igor

+0

また、これらはカスタムテーブルであると思われますが、おそらくFKが必要な場合は、同じ種類のIDを使用する必要があります。最適なオプションは、タイプが一致するようにストアスキーマを修正することです。 – Igor

+0

スキーマはそれ自体「カスタム」ではなく、ユーザーID(GUID)が文字列として表されているMVCのデフォルトのAspNetUsersから生成されます。私はそれを変更しないことを好み、単純に別のテーブルと照合したいと考えています。文字列を 'uniqueindentifier'に変換できる簡単な関数があるはずです。何か案は? – user1477388

答えて

1

最終的に、私はちょうどそのように私のGUID .ToString()の鋳造が容易なアプローチで行くことにしました:

let userOrders = (from uo in ctx.UserOrders where uo.UserId.ToString() == u.Id select uo) 

理由ビーイングを、AspNetUsersのデフォルトの実装では、varchar型であるとして、列を定義していませんuniqueidentifierなので、それを変更するために、私は現在このような何かをしなければならないでしょう、私は現在やっていることに興味がありませんHow to make EF-Core use a Guid instead of String for its ID/Primary key

1

。とにかく、あなたはなぜ自動車に組み込まれたナビゲーションプロパティを使うのではないのですか?

データベースまたはデータ構造に外部キーがある場合。これにより、Entity Frameworkに「ナビゲーション」プロパティが作成されます。そのようなものとして、あなたは子オブジェクトにもっと素早くアクセスできます。あなたのEFオプションに応じて自動的に与えられます。 'インクルード'は、ナビゲーションを取得することを強制します。だから、ちょうど私の人のテーブルから注文(別テーブル)をしたい場合は、私は人を尋問し、それは子供のテーブルを取得します。 Entity Frameworkで「実現」という概念があり、「ToList」や「ToString」を正当なものにするまでは、実際に動作しないことが分かってしまう前にフードの下にあまりにも多くのものを配線しようとすると、

static void Main(string[] args) 
{ 
     using (var context = new TesterEntities()) 
     { 
     var peopleOrders = context.tePerson.Include("teOrder").First(p => p.PersonId == 1).teOrder.ToList(); 
     peopleOrders.ForEach(x => Console.WriteLine($"{x.OrderId} {x.Description}")); 
     } 
} 
関連する問題