2011-05-31 96 views
0

所以我尝试将SQL转换为LINQ查询LINQ查询复杂的联接问题

的逻辑是:

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

但它一直在两侧抱怨的类型等于声明不匹配

任何想法?

注:我宣布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

简单,他们不是相同(兼容)类型。第一个密钥的类型为any的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() } 
+0

非常感谢! – JayX 2011-05-31 20:08:18

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

+0

感谢您的回答,它确实有帮助! – JayX 2011-05-31 20:08:00

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()