0

我需要查询过滤记录,当得到不同的记录时,通过不同的条件获取这些记录信息。我还需要这些是动态的(第一次选择中的数量过滤器)

让我给你看一个例子:

我有 2 张桌子:

tbl客户:

id    customerName  
1        John  
2        Philip  
3        Steve

订单

id    customerId     ordId    payment
1      1              100      True
2      1              101      True
3      1              102      False 
4      2              101      True
5      2              102      True
6      2              103      False 
7      3              101      True  

我的条件是:

where (orderId = 101 and orderId = 102) 

但是获取该客户的所有记录,payment = true我的意思是我的情况与我需要看到的不同。

我想在payment=True不关心 orderId 的情况下接收所有记录

我必须得到:

john    100
john    101  
Philip  101
Philip  102    

清算:我需要两步 - 首先过滤具有 orderId=101&102 的客户,在第二步中我想显示这些选定客户的 orderId 哪些付款是真实的。因此,例如,在第一步中,我得到了 john(订单 id = 101&102),然后显示 john 100 - john 101(付款为真)。考虑 tblorder.id=1 不在第一个查询中,但我必须在最终结果中显示。

@Raphael 引导我更好地表达:我想查看有订单(101 和 102)的客户的所有付款真实订单。但 orderids 可能超过 2 个(感谢@Raphael)。

第二个问题是:它必须是动态的。有时我有超过 10 个必须检查的 orderId - 有时更少。我的意思是我的查询必须灵活。

在 SQL Server 选择命令中,我可以准备一个字符串变量并使用,但在 linq 中我不能这样做。

4

2 回答 2

1

根据我从您的帖子和评论中了解到,您需要所有客户,其中 orderId 为 101 或 102 并且付款是真实的。

您需要带有 orderIds 的 where 子句是动态的,以便您可以更改要在查询之外检查的 Id。

List<int> IDList = new List<int>();
IDList.Add(101);
IDList.Add(102);
IDList.Add(110);
//...

var result = from cust in tblCustomers
             join order in tblOrders on cust.id equals order.customerId
             where IDList.Contains(order.ordId) && order.payment == true
             select new {
                          Name = cust.customerName
                          OrderId = order.ordId
                          payment = order.payment
                          //...
                        }

有了这个,您可以将所有需要检查的 orderId 存储在一个列表中,然后您可以从您的代码中进行编辑。

编辑 我真的没有找到一个干净的解决方案来解决你的问题,所以我绕道而行,这不是很干净,但应该可以。在我的示例中,我创建了 2 个类,CustomerOrder用上面的数据填充它。然后我进行了第一个查询并附加了一个 groupBy 和一个比较分组长度与列表长度的 where 子句

var result = (from cust in Customers
             join order in Orders on cust.Id equals order.customerId
             where IDList.Contains(order.orderId) && 
                   order.payment == true 

             select new {
                         Name = cust.Name,
                         OrderId = order.orderId,
                         Payment = order.payment
                        //...
                        }).GroupBy (r => r.Name)
                          .Where (r => r.Count() == IDList.Count());

输出:

Name OrderId Payment
Philip 101   True 
Philip 102   True 

如果你想要/需要它,我可以为你提供整个 Linqpad 查询,这样你就可以看到我的整个代码以及我所做的事情。说到 Linqpad:忽略 result.Dump() 行。它不适用于视觉工作室。

于 2013-10-28T09:20:45.950 回答
0
void Main()
{
    List<Customer> customers = new List<Customer>
    {
        new Customer { Id = 1, Name = "John" },
        new Customer { Id = 2, Name = "Philip" },
        new Customer { Id = 3, Name = "Steve" }
    };

    List<Order> orders = new List<Order>
    {
        new Order { Id = 1, CustomerId = 1, OrderId = 100, Payment = true },
        new Order { Id = 2, CustomerId = 1, OrderId = 101, Payment = true },
        new Order { Id = 3, CustomerId = 1, OrderId = 102, Payment = false },
        new Order { Id = 4, CustomerId = 2, OrderId = 101, Payment = true },
        new Order { Id = 5, CustomerId = 2, OrderId = 102, Payment = true },
        new Order { Id = 6, CustomerId = 2, OrderId = 103, Payment = false },
        new Order { Id = 7, CustomerId = 3, OrderId = 101, Payment = true }
    };

    List<int> orderIds = new List<int> { 101, 102 };

    var customersWithRelevantOrders =
        from ord in orders
        group ord by ord.CustomerId into customerOrders
        where orderIds.All (
            i => customerOrders.Select (co => co.OrderId).Contains(i))
        select customerOrders.Key;

    var paymentTrueOrdersForTheseCustomers =
        from ord in orders
        join cust in customers on ord.CustomerId equals cust.Id
        where ord.Payment
        where customersWithRelevantOrders.Contains(cust.Id)
        select new
        {
            Name = cust.Name,
            OrderId = ord.OrderId
        };
}

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public int OrderId { get; set; }
    public bool Payment { get; set; }
}
于 2013-10-29T10:28:10.653 回答