我正在通过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,则第二种方法可能更容易。在这种情况下,您可以使用IN
esql运算符。
此外,如果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;
}
}