如何完善通过另一个列表绑定到DTO的linq查询



我正在通过C#做一些SalesForce工作,我有一个案例列表。您不需要熟悉SalesForce就可以了解问题所在。我正在尝试检索CaseComment对象的列表,其中CaseComment的parentId与Case的Id匹配。即:

案例1
Id=123456

案例注释1
Id=5532094
ParentId=234242

案例注释2
Id=984984
ParentId=123456

在这种情况下,事例注释2的parentId与事例1匹配,因此应该返回。这是我目前使用的代码:

    static List<SalesForceCaseComment> GetCaseCommentsFromListOfCases(List<SalesForceCase> Cases)
    {
        using (salesforce_backupsEntities le = new salesforce_backupsEntities())
        {
            List<SalesForceCaseComment> casecomments = (from c in le.CaseComments select new SalesForceCaseComment
                                                            {
                                                                CommentBody = c.CommentBody,
                                                                CreatedById = c.CreatedById,
                                                                Id = c.Id,
                                                                IsDeleted = c.IsDeleted,
                                                                IsPublished = c.IsPublished,
                                                                LastModifiedById = c.LastModifiedById,
                                                                ParentId = c.ParentId
                                                            }).Where(n => Cases.Any(s=> s.Id == n.ParentId)).ToList();
            return casecomments;              
        }
    }

不幸的是,这导致了以下错误:

Unable to create a constant value of type 'DTO.SalesForceCase'. Only primitive types or enumeration types are supported in this context.

看起来您正在有效地将本地List<SalesForceCase>连接到提供者端的表,这可能不起作用。如果提供商支持Contains运算符,则可以执行以下操作:

var ids = Cases.Select(c => c.Id).ToArray();
var comments = from c in le.CaseComments
               where ids.Contains(c.ParentId)
               select new /* projection */;

基本上,这意味着下划线提供程序不支持枚举类型,因此您需要编写自己的访问者来枚举它(更难),或者只需将其转换为带有"或"的基元类型的表达式,这只意味着在数组中循环并添加条件。

如果salesforce_backupsEntities继承自ObjectContext,则第二种方法可能更容易。在这种情况下,您可以使用INesql运算符。

此外,如果Case对象中有导航属性,您可能希望将对象附加到上下文并加载导航属性(case.Comments.Load()

我想这样的方法应该有效(join而不是Where):

  static List<SalesForceCaseComment> GetCaseCommentsFromListOfCases(List<SalesForceCase> Cases)
{
    using (salesforce_backupsEntities le = new salesforce_backupsEntities())
    {
        List<SalesForceCaseComment> casecomments = (from c in le.CaseComments 
where Cases.Select(x => x.Id).Contains(c.ParentId)
select new SalesForceCaseComment
                                                        {
                                                            CommentBody = c.CommentBody,
                                                            CreatedById = c.CreatedById,
                                                            Id = c.Id,
                                                            IsDeleted = c.IsDeleted,
                                                            IsPublished = c.IsPublished,
                                                            LastModifiedById = c.LastModifiedById,
                                                            ParentId = c.ParentId
                                                        })).ToList();
        return casecomments;              
    }
}

最新更新