私はlinqを初めて使っています。linq join on guidと文字列
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()
でクエリを書いて幸せだった:私は2つの列(AnonymousUser.AnonymousId
がuniqueidentifier
いるとcomment.UserIdはnvarchar(100)
ている)を結合し、以下のようなものは、クエリを実行する必要があります!エンティティ・フレームワークはそれをSQLに変換する方法を知らないことが判明しました。 Guid.Parse(string)
についても同様です。また、new Guid(string)
は、エンティティへのlinqでは使用できません(パラメータのないコンストラクタのみが許可されます)!
検索後、私はEF 4.0でそのようなことをすることができないことを知った!私は自分のコードをストアドプロシージャに移行しました。私は実際にそれについて幸せではありません。
エンティティフレームワークにCAST
をSQLで使用するように指示できますか?
この問題の解決方法はありますか?ロジックをコードで実現できる方法はありますか?
:私はでこれを行うことを意味しました。GO。そうしないと、最初のテーブルからEntitiesを取得し、そのIDをリストに入れて、2番目のテーブルからエンティティを取得します。
'comment.UserId'がGUIDの文字列表現である場合、その列を一意の識別子に変換する方が簡単でしょうか?これは、Entity FrameworkでSQLでこのキャストを実行しようとするよりも優れたソリューションです。 – mclark1129
残念ながら、必ずしもGUIDというわけではありません。ユーザのタイプに基づいて、 'Guid'または' int'であるかもしれません。 – Ashkan
'new Guid(string)'の代わりに['Guid.Parse(string)'](http://stackoverflow.com/a/8067647/484214)を試しましたか? –