C# 使用具有多个条件和子查询的LINQ左连接

C# 使用具有多个条件和子查询的LINQ左连接,c#,sql-server,linq,C#,Sql Server,Linq,我想左键联接两个表并求和一个字段,因此我进行了以下查询: IQueryable<Reference.Inventory.SearchDetailRequester> _qRequester = from a in dbErp.EPROC_TR_ER_DETAIL join b in dbErp.EPROC_TR_INVENTORY on new Reference.Inventory.SearchDetailRequester { ID_REQUEST = a

我想左键联接两个表并求和一个字段,因此我进行了以下查询:

IQueryable<Reference.Inventory.SearchDetailRequester> _qRequester =
    from a in dbErp.EPROC_TR_ER_DETAIL
    join b in dbErp.EPROC_TR_INVENTORY on
    new Reference.Inventory.SearchDetailRequester { ID_REQUEST = a.ID_REQUEST , ID_KATALOG = a.ID_KATALOG}
    equals
    new Reference.Inventory.SearchDetailRequester { ID_REQUEST = b.ID_REQUEST, ID_KATALOG = b.ID_KATALOG }
    into inv_join 
    from c in inv_join.DefaultIfEmpty()
    where a.ID_REQUEST == ID_REQUEST && a.APROVE_BY_DS == 1 && a.APROVE_BY_GS == 1

    select new Reference.Inventory.SearchDetailRequester
    {
        ID_KATALOG = a.ID_KATALOG,
        TYPE_OF_GGS = a.TYPE_OF_GGS,
        TRANSACTION_TYPE = "OUT",
        DATE = c.DATE ?? "",
        QTY = -1 * c.QTY ?? a.QTY,
        ID_INVENTORY = c.ID_INVENTORY,
        QTY_AVAILABLE = ((from d in dbErp.EPROC_TR_INVENTORY
                          where d.ID_KATALOG == a.ID_KATALOG
                          group d by new { d.ID_KATALOG } into e
                          select new { qty_ava = (System.Int32)e.Sum(p => p.QTY ?? 0) }).FirstOrDefault().qty_ava)
    };
IQueryable\u qRequester=
从dbErp.EPROC\u TR\u ER\u详细信息中的
将b加入dbErp.EPROC\u TR\u库存
新Reference.Inventory.SearchDetailRequester{ID_REQUEST=a.ID_REQUEST,ID_KATALOG=a.ID_KATALOG}
等于
新Reference.Inventory.SearchDetailRequester{ID_REQUEST=b.ID_REQUEST,ID_KATALOG=b.ID_KATALOG}
进入inv_join
来自inv_join.DefaultIfEmpty()中的c
其中a.ID\u REQUEST==ID\u REQUEST和a.APROVE\u BY\u DS==1和a.APROVE\u BY\u GS==1
选择new Reference.Inventory.SearchDetailRequester
{
ID_KATALOG=a.ID_KATALOG,
类型为a。类型为,
交易\ u TYPE=“OUT”,
日期=c.日期,
数量=-1*c.数量??a.数量,
ID_存货=c.ID_存货,
可用数量=(从dbErp.EPROC\u TR\u库存中的d开始)
其中d.ID_KATALOG==a.ID_KATALOG
新{d.ID_KATALOG}进入e的d组
选择新的{qty_ava=(System.Int32)e.Sum(p=>p.qty??0)})
};
但当我调试时,我得到了以下消息:

“Reference.Inventory.SearchDetailRequester”类型在一个LINQ to Entities查询中出现在两个结构不兼容的初始化中。一个类型可以在同一查询中的两个位置初始化,但前提是在两个位置设置了相同的属性,并且这些属性的设置顺序相同


有人可以帮忙吗?

您需要使用匿名类型加入,我认为您不能像以前那样选择一个类:

new { ID_REQUEST = a.ID_REQUEST , ID_KATALOG = a.ID_KATALOG}
equals
new { ID_REQUEST = b.ID_REQUEST, ID_KATALOG = b.ID_KATALOG }
例如,如果数据库中的
b.ID\u KATALOG
可为空,则可以这样解决:

new { ID_REQUEST = a.ID_REQUEST , ID_KATALOG = a.ID_KATALOG}
equals
new { ID_REQUEST = b.ID_REQUEST, ID_KATALOG = (int)b.ID_KATALOG }
这当然是假设ID_KATALOG是一个
int
。 或者你也可以用另一种方式来做:

new { ID_REQUEST = a.ID_REQUEST , ID_KATALOG = (int?)a.ID_KATALOG}
equals
new { ID_REQUEST = b.ID_REQUEST, ID_KATALOG = b.ID_KATALOG }

此消息无效.net读取错误:查询正文必须以select子句或group子句结尾。此消息无效:join子句中某个表达式的类型不正确。对“GroupJoin”的调用中的类型推断失败。匿名类型中的某个属性对b可为null,但对a不可为null吗?(int?ID_Request for a!=int ID_Request for b,即使它们在db中相同)@Karl根据您帖子中描述的问题,初始答案是正确的,应该接受。进一步的问题是不相关的,所以要么自己解决,要么发布另一个问题并提供实体类,这样人们就不会试图帮助猜测所需的信息