2

我收到“不支持“加入”方法”错误...有趣的是,我只是将第一个 LINQ 转换为第二个版本,但它不起作用...

我想要的是LINQ版本#3,但它也不起作用......


这有效

var query_join9 = from s in orgSvcContext.CreateQuery(ServiceAppointment.EntityLogicalName)
join b in orgSvcContext.CreateQuery(bh_product.EntityLogicalName)
on s["bh_contract"] equals b["bh_contract"]
where ((EntityReference)s["bh_contract"]).Id == Guid.Parse("09BDD5A9-BBAF-E111-A06E-0050568B1372")
select new
{
Events = s,
Products = b
};

这不

var query_join9 = from s in orgSvcContext.CreateQuery(ServiceAppointment.EntityLogicalName)
join b in orgSvcContext.CreateQuery(bh_product.EntityLogicalName)
on new { contractid = s["bh_contract"] }
equals new { contractid = b["bh_contract"] }
where ((EntityReference)s["bh_contract"]).Id == Guid.Parse("09BDD5A9-BBAF-E111-A06E-0050568B1372")
select new
{
Events = s,
Products = b
};

此外,这不是,这是一个复合连接,也是我真正的目标

var query_join9 = from s in orgSvcContext.CreateQuery(ServiceAppointment.EntityLogicalName)
join b in orgSvcContext.CreateQuery(bh_product.EntityLogicalName)
on new { contractid = s["bh_contract"], serviceid = s["serviceid"] }
equals new { contractid = b["bh_contract"], serviceid = s["serviceid"] }
where ((EntityReference)s["bh_contract"]).Id == Guid.Parse("09BDD5A9-BBAF-E111-A06E-0050568B1372")
select new
{
Events = s,
Products = b
};

我尝试了早期绑定,但仍然无法正常工作......

var query_join9 = from s in orgSvcContext.CreateQuery<ServiceAppointment>()
join b in orgSvcContext.CreateQuery<bh_product>()
on new { foo = s.bh_contract.Id }
equals new { foo = b.bh_Contract.Id }
where s.bh_contract.Id == Guid.Parse("09BDD5A9-BBAF-E111-A06E-0050568B1372")
select new
{
Events = s,
Products = b
};

仍然不工作

var query_join9 = from s in orgSvcContext.CreateQuery<ServiceAppointment>()
join b in orgSvcContext.CreateQuery<bh_product>()
on new { s.bh_contract.Id, s.ServiceId }
equals new { b.bh_Contract.Id, ServiceId = b.bh_Service }
where s.bh_contract.Id == Guid.Parse("09BDD5A9-BBAF-E111-A06E-0050568B1372")
select new
{
Events = s,
Products = b
};

但我只是想在这里做示例How to do joins in LINQ on multiple fields in single join

我错过了什么?

提前致谢

4

2 回答 2

1

您看过MSDN 示例吗?那里有一些多列连接示例:

using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
{
 var list_join = (from a in svcContext.AccountSet
                  join c in svcContext.ContactSet
                  on a.PrimaryContactId.Id equals c.ContactId
                  where a.Name == "Contoso Ltd" &&     <<--- multiple join here
                  a.Address1_Name == "Contoso Pharmaceuticals"
                  select a).ToList();
 foreach (var c in list_join)
 {
  System.Console.WriteLine("Account " + list_join[0].Name
      + " and it's primary contact "
      + list_join[0].PrimaryContactId.Id);
 }
}

这个其他线程可能是相关的

于 2012-07-20T15:17:49.603 回答
1

虽然我不完全确定您使用的是哪种 CRM,但我认为您误解了一些东西。为了使 LINQ 查询正常工作,需要有一个底层数据源的 LINQ 提供程序——负责将例如、运算符使用等链Join转换Where为数据源的查询 API 的代码位. 这可能是 SQL、一些自定义查询语言或一些方法链。

两个 LINQ 提供程序(例如,一个用于LINQ to DataSet和您自己编写的一些自定义提供程序)不必支持相同的方法和其他代码。LINQ 提供程序支持的 LINQ 方法(和/或其他嵌入式语句)的精确子集取决于其实现。

这样看,您使用的 LINQ 提供程序似乎不理解使用多个字段的连接的标准语法,或者似乎根本不理解匿名类型的用法,这并不奇怪。

我的建议是搜索提供的 LINQ 提供程序的文档以查看它支持哪些查询操作(也许有关于不支持这种特定查询模式的注释)。如果做不到这一点,您将不得不求助于某种其他查询——一个不涉及等值连接的查询。也许您最好的选择是分别执行连接,然后将两个结果组相交。这实际上取决于案件的具体情况。

于 2012-07-13T01:24:55.537 回答