【发布时间】:2012-08-26 13:49:39
【问题描述】:
我是 linq 的新手。我需要运行一个连接两列的查询(AnonymousUser.AnonymousId 是 uniqueidentifier 和 comment.UserId 是 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 中不可能做这样的事情!我将我的代码迁移到了一个我不太满意的存储过程。
是否可以告诉实体框架在 SQL 中使用CAST?
这个问题有什么解决办法吗?有什么方法可以将逻辑带入代码中?
注意:我的意思是一次完成。否则,一种可能的解决方案是从第一个表中获取实体,并将 Id 放入列表中并从第二个表中获取实体。
【问题讨论】:
-
如果
comment.UserId是 GUID 的字符串表示形式,那么将该列也转换为唯一标识符会更容易吗?这可能是比让实体框架尝试在 SQL 中为您执行此转换更好的解决方案。 -
不幸的是,它并不总是 GUID。根据用户类型,它可能是
Guid或int。 -
你试过用
Guid.Parse(string)代替new Guid(string)吗? -
你试过了吗 :D ??不成功:LINQ to Entities 无法识别方法 'System.Guid Parse(System.String)' 方法,并且该方法无法转换为存储表达式。
标签: c# linq entity-framework-4 linq-to-entities