首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >guid和string列上的linq联接

问guid和string列上的linq联接
EN

Stack Overflow用户
提问于 2012-08-26 13:49:39
回答 2查看 6.1K关注 0票数 6

我是林克的新手。我需要运行一个连接两个列的查询(AnonymousUser.AnonymousId是uniqueidentifier,comment.UserId是nvarchar(100)),如下所示:

代码语言:javascript
复制
        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吗?

这个问题有什么解决办法吗?有什么方法可以将逻辑引入代码吗?

注意到:我打算在one GO中这样做。否则,一种可能的解决方案是从第一个表中获取实体,并将in放在一个列表中,然后从第二个表中获取实体。

EN

回答 2

Stack Overflow用户

发布于 2012-08-30 19:47:44

在应用这些方法之前调用toList()。比如:

代码语言:javascript
复制
var Product = db.Products.Where(p => p.ProductId == Guid.Parse("B4E913F9-166C-49BA-AADE-6DB889D1756F")).Single();

抛出一个

c# LINQ实体不识别"System.Guid Parse“(System.String)方法,该方法无法转换为存储表达式

但这样做是可行的:

代码语言:javascript
复制
var Product = db.Products.ToList().Where(p => p.ProductId == Guid.Parse("B4E913F9-166C-49BA-AADE-6DB889D1756F")).Single()

p.s.:我认为您将失去懒散加载,但是您可以在调用.Include ()之前使用.ToList()进行急切加载。

票数 0
EN

Stack Overflow用户

发布于 2012-08-30 20:15:57

如果您的list是对象列表,您可以将其转换为以Guid作为标识符的类型,首先创建新的匿名类型,然后基于UserId筛选它,确保int类型的UserId不会包含在join中:

代码语言:javascript
复制
     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();

现在,您可以使用secondList在db上运行查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12130655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档