2016-08-23 35 views
0

我有两个表; EndToEnd和PartPort。我想从EndToEnd中的同一行中获取PartPortA和PartportB数据,并使用它们查询Partport,并从Partport中获取其可能位于Partport表中任何行的PartGid。到目前为止,我可以做到这一点,但我必须做两个不同的LINQ调用,但我想将其降低到一个。这里是我的代码:C#Linq语句加入两个表和多列

// this demonstrates how to join two tables, however only works for one AssetportGid at a time 
    var part_portGid_a_results = (from icp in entities.EndToEnd 
        where icp.IntertPortGidA != null && 
        icp.IntertPortGidB != null 
        join ica in entities.PartPort 
        on icp.PartPortA equals ica.PortGid 
        select new { icp.PartPortA, ica.PartGid, }).ToList(); 

    var part_portGid_b_results = (from icp in entities.EndToEnd 
            where icp.IntertPortGidA != null && 
            icp.IntertPortGidB != null 
            join ica in entities.PartPort 
            on icp.PartPortB equals ica.PortGid 
            select new { icp.PartPortA, ica.PartGid, }).ToList(); 



    return Json(part_portGid_a_results, JsonRequestBehavior.AllowGet); 

我想什么做的,我已经尝试过,但得到的错误是这样的:

   var part_portGid_a_results = (from icp in entities.EndToEnd 
        where icp.IntertPortGidA != null && 
        icp.IntertPortGidB != null 
        join ica in entities.PartPort 
        on icp.PartPortA && icp.PartPortB equals ica.PortGid 
        select new { icp.PartPortA, ica.PartGid, }).ToList(); 

我得到的错误是:

Guid? EndToEnd.PartPortB 

Error: 
    Operator '&&' cannot be applied to operands of type 'System.Guid' and 'System.Guid?' 
+0

链接行“上icp.PartPortA && icp.PartPortB等于ica.PortGid”不正确,它不是一个有效的布尔表达式,因为icp.PartPortA是一个Guid,而不是布尔值。你是否想加入两个栏目?然后试试这个,而不是:“on icp.PartPortA等于ica.PortGid && icp.PartPortB等于ica.PortGid” – HaukurHaf

+0

智能感知似乎不喜欢那 – DeeTee

+0

可能是因为一个是可以为空的GUID,另一个不是...(使用.Value可空的guid) – HaukurHaf

回答

2

你不要使用加入。如果你想用“复杂”比较的加入,只是做一个笛卡尔乘积(from ... from),并通过where条款

var part_portGid_results = (from icp in entities.EndToEnd 
          where icp.IntertPortGidA != null && 
          icp.IntertPortGidB != null 
          from ica in entities.PartPort 
          where icp.PartPortA == ica.PortGid 
           || icp.PartPortB == ica.PortGid 
          select new { icp.PartPortA, ica.PartGid, }).ToList();