6

我是 linq 的新手。我需要运行一个连接两列(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?

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

注意:我打算一次性完成。否则,一种可能的解决方案是从第一个表中获取实体,并将 Id 放入列表中并从第二个表中获取实体。

4

2 回答 2

0

如果您list是对象列表,您可以将其转换为以 Guid 作为标识符的类型,首先创建新的匿名类型,然后根据 过滤它UserId,确定UserId哪个是 type int,不会包含在 join 中:

     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.

于 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 进行急切加载。

于 2012-08-30T19:47:44.597 回答