6

私はlinqが初めてです。以下のような2 つの列 ( AnonymousUser.AnonymousIdbeinguniqueidentifierと comment.UserId being )を結合するクエリを実行する必要があります。nvarchar(100)

        using (CommentEntities db = new CommentEntities())
        {
            // filteredComments is a query that is not run until the next .ToList()
            IQueryable<Comment> filteredComments = this.CommentGetList(...);
            var query = from comment in filteredComments
                         // following line is the syntax error, because columns' types don't match
                         join user in db.AnonymousUsers on comment.UserId equals user.AnonymousId into gj
                         from userNull in gj.DefaultIfEmpty()
                         select new CommentWithName
                         {
                             Comment = comment,
                             UserId = comment.UserId,
                             FirstName = (userNull == null ? "" : userNull.Name),
                             LastName = "",
                             Email = (userNull == null ? "" : userNull.Email)
                         };
            return query.ToList();
        }

まず、クエリを.ToString()!で書いてよかったです。エンティティ フレームワークは、それを SQL に変換する方法を認識していないことが判明しました。についても同様ですGuid.Parse(string)。またnew Guid(string)、エンティティへの linq では使用できません (パラメーターなしのコンストラクターのみが許可されます)。

検索した結果、EF 4.0 ではそのようなことはできないことがわかりました。コードをストアド プロシージャに移行しましたが、あまり満足していません。

エンティティ フレームワークCASTに SQL で a を使用するように指示することは可能ですか?

この問題の解決策はありますか? ロジックをコードに組み込む方法はありますか?

注: 1 回の GOで実行するつもりでした。それ以外の場合、考えられる解決策の 1 つは、最初のテーブルからエンティティを取得し、ID をリストに入れて、2 番目のテーブルからエンティティを取得することです。

4

2 に答える 2

0

あなたlistがオブジェクトリストである場合、それを識別子としてGuidを持つタイプに変換できます。最初に新しい匿名タイプを作成し、次にそれをベースにフィルタリングします。どちらがタイプであるかをUserId確認し、joinに含めないでください。UserIdint

     int output = 0;

     var secondList = list.Where(x=>!int.TryParse(x.UserID, out output))
                     .Select(x=>new {Comment = x, ID = new Guid(x.UserID))
                     .ToList();

これで、を使用してdbでクエリを実行できますsecondList

于 2012-08-30T20:15:57.710 に答える
0

これらのメソッドを適用する前に toList() を呼び出します。お気に入り:

var Product = db.Products.Where(p => p.ProductId == Guid.Parse("B4E913F9-166C-49BA-AADE-6DB889D1756F")).Single();

を投げます

c# LINQ to Entities はメソッド "System.Guid Parse" (System.String)' メソッドを認識せず、このメソッドはストア式に変換できません

しかし、これは機能します:

var Product = db.Products.ToList().Where(p => p.ProductId == Guid.Parse("B4E913F9-166C-49BA-AADE-6DB889D1756F")).Single()

ps: 遅延読み込みは失われると思いますが、.ToList() を呼び出す前に .Include を使用してeagerloading を実行できます。

于 2012-08-30T19:47:44.597 に答える