【问题标题】:How can I use this Linq Query using it with a multiple parameter by Join tables如何通过连接表使用此 Linq 查询和多个参数
【发布时间】:2013-11-23 02:45:41
【问题描述】:
var list = dc.Orders.
            Join(dc.Order_Details,
            o => o.OrderID, od => od.OrderID, <-- what if i have 2 more parameters let say an ID and a REC on both table. ex.: o=> o.OrderID && o.ItemName, od => od.OrderID && od.Itemname then (o, od) but its result is error? is there another way?
            (o, od) => new
            {
                OrderID = o.OrderID,
                OrderDate = o.OrderDate,
                ShipName = o.ShipName,
                Quantity = od.Quantity,
                UnitPrice = od.UnitPrice,
                ProductID = od.ProductID
            }).Join(dc.Products,
                    a => a.ProductID, p => p.ProductID, <-- at this point too?
                    (a, p) => new
                    {
                        OrderID = a.OrderID,
                        OrderDate = a.OrderDate,
                        ShipName = a.ShipName,
                        Quantity = a.Quantity,
                        UnitPrice = a.UnitPrice,
                        ProductName = p.ProductName
                    });

是否可以通过连接 3 个表来使用这个带有多个参数的 lambda 表达式 linq 查询?

--- 更新仍然错误 -- :(

var header = DB.Delivery_HeaderRECs.Join(DB.Delivery_DetailsRECs, <-- Red Line on DB.Delivery_HeaderRECs.Join
                                q => new { q.drNO, q.RecNO },
                                qw => new { qw.DrNO, qw.RecNO },
                                (q, qw) => new
                                {
                                    DR = q.drNO,
                                    DATE = q.DocDate,
                                    RECNO = q.RecNO,
                                    CUSTID = q.CustomerID,
                                    CUSTADDR = q.CustomerADDR,
                                    RELEASE = q.ReleasedBy,
                                    RECEIVE = q.ReceivedBy,
                                    REMARKS = q.Remarks,

                                    ITEM = qw.ItemCode,
                                    DESC = qw.ItemDesc,
                                    QTY = qw.Qty,
                                    COST = qw.Unit,
                                    PLATENO = qw.PlateNo,
                                    TICKETNO = qw.TicketNo
                                }).Join(DB.Delivery_TruckScaleRECs,
                                w => new { w.DR, w.TICKETNO },
                                we => new { we.DrNo, we.TicketNO },
                                (w, we) => new 
                                {
                                    DR = w.DR,
                                    DATE = w.DATE,
                                    RECNO = w.RECNO,
                                    CUSTID = w.CUSTID,
                                    CUSTADDR = w.CUSTADDR,
                                    RELEASE = w.RELEASE,
                                    RECEIVE = w.RECEIVE,
                                    REMARKS = w.REMARKS,

                                    ITEM = w.ITEM,
                                    DESC = w.DESC,
                                    QTY = w.QTY,
                                    COST = w.COST,
                                    PLATENO = w.PLATENO,
                                    TICKETNO = w.TICKETNO,

                                    TRANSAC = we.TransactionType,
                                    FWEIGHT = we.FirstWeight,
                                    SWEIGHT = we.SecondWeight,
                                    NWEIGHT = we.NetWeight
                                }).FirstOrDefault();

我根据答案进行了更改,但声明上方有一个错误: “无法从用法中推断出方法的类型参数。尝试显式指定类型参数”。我认为这是在谈论我所做的参数..

【问题讨论】:

  • not on both table 是什么意思?看起来这两个参数是某种外部变量
  • 对不起先生..我的错误我已经解决了。

标签: c# .net sql linq


【解决方案1】:

您可以像这样使用匿名类型的连接:

var list = dc.Orders.Join(dc.Order_Details,
                          o => new { o.OrderID, o.ItemName}, 
                          od => new { od.OrderID, od.ItemName},
                          ...);

匿名类型将被编译为使用自动实现的EqualsGetHashCode,以便通过所有相应属性的相等性得出相等性。只需在new {....} 中添加您想要的更多属性。注意2new {...}中提供的属性顺序应该是相同的对应顺序。名称也应该匹配,您可以显式指定名称以确保这一点(在某些情况下需要),例如:

new {OrderID = o.OrderID, Name = o.ItemName}

但是,在您的情况下,属性名称将用作项目的相同属性。

更新

本次更新只是针对你的具体参数的修复,我说过属性名应该是一样的,如果不是你必须明确地这样命名:

var list = dc.Orders.Join(dc.Order_Details,
                           q => new {DrNO =  q.drNO, q.RecNO}, 
                           qw => new {DrNO = qw.DrNO, qw.RecNO},
                           ...);

【讨论】:

  • 它有一个错误先生...我将粘贴整个代码它说“方法的类型参数不能从用法中推断出来尝试明确指定类型参数”
  • @Oblivious7 你能贴出你试过的整个代码吗?我确定不应该有任何错误,顺便说一句,... 是您必须填写的内容。你的ood 当然应该有ItemName,这只是一个例子。
  • 我已经更新了代码先生..你可以在上面检查它我在它上面贴了标签更新错误..
  • @Oblivious7 请确认这个q.drNO,是你拥有的还是q.DrNO?请注意,区分大小写。顺便说一句,请重新阅读我的答案,相应的属性名称应该相同
  • 在我的表 1 中是 drNO,在表 2 中是 DrNO,这有关系吗?它必须假设是相同的格式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
相关资源
最近更新 更多