当列表有多个字段时使用Contains

本文关键字:Contains 字段 列表 | 更新日期: 2023-09-27 18:19:00

我使用两个视图,它们都放置在不同的数据库(在不同的服务器上)。我从两者获得记录,我必须在LINQ中使用完整的外部连接功能(我知道LINQ不支持完整的外部连接)来获取所有记录,无论它们是否匹配。

为此,我使用以下代码片段

调用View1:

var specialRequest = (from specialReq in dc1.View1
                     select specialReq).ToList();

这个视图返回多个字段,我需要所有的字段。

Call for View2 and Join with View1 result:

 var SummaryDataLeftOuter = (
    from specialReq in specialRequest
    join summary in dc.View2 on specialReq.inv_item_id equals summary.inv_item_id
    into tempspecialReq
    from summary in tempspecialReq.DefaultIfEmpty()
    select new Summary
        {
            inv_item_id = string.IsNullOrEmpty(specialReq.inv_item_id) ? "" : specialReq.inv_item_id.Contains("NO ITEM NUMBER") ? "NO PART #" : specialReq.inv_item_id,
            description = specialReq.description,
            unit_of_measure = specialReq.unit_of_measure,
            total_onorder_qty = (specialReq.TotalOrder.HasValue ? Convert.ToInt32(specialReq.TotalOrder) : 0) + (summary == null ? 0 : summary.TotalOrder.HasValue ? Convert.ToInt32(summary.TotalOrder) : 0),
            open_order_qty = (specialReq.TotalOpen.HasValue ? Convert.ToInt32(specialReq.TotalOpen) : 0) + (summary == null ? 0 : summary.OpenOrder.HasValue ? Convert.ToInt32(summary.OpenOrder) : 0),
            picked_qty = summary == null ? 0 : summary.PickedQty.HasValue ? Convert.ToInt32(summary.PickedQty) : 0,
            qty_shipped = summary == null ? 0 : summary.qty_shipped.HasValue ? Convert.ToInt32(summary.qty_shipped) : 0,
            EnableLink = string.IsNullOrEmpty(specialReq.inv_item_id) ? false : specialReq.inv_item_id.Contains("NO ITEM NUMBER") ? false : true
        }
).ToList();

更改表顺序后再次使用Join:

var SummaryDataRightOuter = (
    from summary in dc.View2
    join specialReq in specialRequest on summary.inv_item_id equals specialReq.inv_item_id
    into tempsummary
    from specialReq in tempsummary.DefaultIfEmpty()
    select new Summary
        {
            inv_item_id = string.IsNullOrEmpty(summary.inv_item_id) ? "" : summary.inv_item_id.Contains("NO ITEM NUMBER") ? "NO PART #" : summary.inv_item_id,
            description = summary.descr60,
            unit_of_measure = summary.unit_of_measure,
            total_onorder_qty = specialReq == null ? 0 : (specialReq.TotalOrder.HasValue ? Convert.ToInt32(specialReq.TotalOrder) : 0) + (summary == null ? 0 : summary.TotalOrder.HasValue ? Convert.ToInt32(summary.TotalOrder) : 0),
            open_order_qty = specialReq == null ? 0 : (specialReq.TotalOpen.HasValue ? Convert.ToInt32(specialReq.TotalOpen) : 0) + (summary == null ? 0 : summary.OpenOrder.HasValue ? Convert.ToInt32(summary.OpenOrder) : 0),
            picked_qty = summary == null ? 0 : summary.PickedQty.HasValue ? Convert.ToInt32(summary.PickedQty) : 0,
            qty_shipped = summary == null ? 0 : summary.qty_shipped.HasValue ? Convert.ToInt32(summary.qty_shipped) : 0,
            EnableLink = specialReq == null ? false : string.IsNullOrEmpty(specialReq.inv_item_id) ? false : specialReq.inv_item_id.Contains("NO ITEM NUMBER") ? false : true
        }
);

现在在第二次调用我得到以下异常:

  Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator

我已经在网上搜索了很多,得到了很多解决方案,他们都说使用包含。但他们都给出了一个例子,其中第一个列表,即specialRequest只包含一列,例如一个例子,你可以在这里检查。但是我需要所有的列

问题:

当列表有多个字段时如何使用Contains()。

当列表有多个字段时使用Contains

在我的问题中,你看到我直接在join中使用view2,而不将其分配到任何列表中。这就是问题的主要原因。

解决方案:

首先将视图结果赋值到列表中,然后使用该列表进行进一步处理。