LINQ查询复杂的连接问题

时间:2011-05-31 19:59:45

标签: linq

所以我试图将SQL转换为LINQ查询

逻辑是:

  JOIN SalesPeriod SP1 
  ON
     SP1.SalesPeriodId = SE1.SalesPeriodId AND SP1.SalePeriodId = .....(XML stuff)

但它一直抱怨equals声明两边的类型不匹配

有什么想法吗?

注意:我声明了b和d,因为它不接受匿名类型成员       我分别测试了两个相同的条件,它们都工作

谢谢

   join SP1 in fentities.SalesPeriods
                on new { SE1.SalesPeriodId, b = XDocument.Load(MI.Body).Element("ns:Transfer").Element("ns:ReceivedBy").Element("ns:Id").FirstNode.ToString() }
                equals new { SP1.SalesPeriodId, d = SP1.SalesPeriodId.ToString() }

3 个答案:

答案 0 :(得分:3)

简单,它们不是相同(兼容)类型。第一个键的类型为SalesPeriodId,字符串类型为b。第二个键的类型为SalesPeriodId(可能与第一个相同),类型为d。你无法将这些与彼此进行比较。 必须具有以相同顺序声明的相同类型的相同属性。只需选择其中一个名称bd并使用该名称。

...
join SP1 in fentities.SalesPeriods
    on new { SE1.SalesPeriodId, b = XDocument.Load(MI.Body).Element("ns:Transfer").Element("ns:ReceivedBy").Element("ns:Id").FirstNode.ToString() }
    equals new { SP1.SalesPeriodId, b = SP1.SalesPeriodId.ToString() }

答案 1 :(得分:1)

您的两个匿名类型不匹配,b& d要具体..尝试对齐签名..

join SP1 in fentities.SalesPeriods
            on new { SE1.SalesPeriodId, b = XDocument.Load(MI.Body).Element("ns:Transfer").Element("ns:ReceivedBy").Element("ns:Id").FirstNode.ToString() }
            equals new { SP1.SalesPeriodId, b = SP1.SalesPeriodId.ToString() }

在该示例中,两个匿名对象将具有相同的属性定义(SalesPeriodIdb

答案 2 :(得分:0)

不要坚持将完整的连接条件放入'ON'子句中。分为两部分的条件,将其中一个放入'ON'子句,将另一个放入'WHERE'子句。

    join SP1 in fentities.SalesPeriods
            on SE1.SalesPeriodId equals SP1.SalesPeriodId        
    where XDocument.Load(MI.Body).Element("ns:Transfer").Element("ns:ReceivedBy").Element("ns:Id").FirstNode.ToString() == SP1.SalesPeriodId.ToString()