LINQ QUERY BY Relational division [英] LINQ QUERY BY Relational division

查看:36
本文介绍了LINQ QUERY BY Relational division的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2张桌子:



tblCustomers:



I have 2 below tables:

tblCustomers:

id    customerName 
1     John 
2     Philip 
3     Steve





tblOredrs:





tblOredrs:

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





我的条件是:



其中(orderId = 101和orderId = 102)



我想看到所有支付真实订单,对于有订单的客户(101& 102)。但是orderid可能超过2,它必须是动态的。



i必须得到:



john 100

约翰101

菲利普101

菲利普102



my condition is:

where (orderId = 101 and orderId = 102)

I want to see all payment true order, for the customers that have orders (101 & 102). but orderids may be more than 2, it must be dynamic.

i must get:

john 100
john 101
Philip 101
Philip 102

推荐答案

static void Main(string[] args)
      {
          DataTable customer = new DataTable();

          customer.Columns.Add("CustomerId");
          customer.Columns.Add("CustomerName");

          customer.Rows.Add("1", "John");
          customer.Rows.Add("2", "Philip");
          customer.Rows.Add("3", "Steve");

          DataTable orders = new DataTable();

          orders.Columns.Add("Id");
          orders.Columns.Add("CustomerId");
          orders.Columns.Add("OrderId");
          orders.Columns.Add("Payment");

          orders.Rows.Add("1", "1", "100", "True");
          orders.Rows.Add("2", "1", "101", "True");
          orders.Rows.Add("3", "1", "102", "False");
          orders.Rows.Add("4", "2", "101", "True");
          orders.Rows.Add("5", "2", "102", "True");
          orders.Rows.Add("6", "2", "103", "False");
          orders.Rows.Add("7", "3", "101", "True");


//Linq Query What you are expecting

          var results = from myOrders in orders.AsEnumerable()
                        join myCustomer in customer.AsEnumerable()
                        on myOrders.Field<string>("CustomerId") equals myCustomer.Field<string>("CustomerId")

                        where (myOrders.Field<string>("OrderId") == "101"
                            || myOrders.Field<string>("OrderId") == "102"
                            && myOrders.Field<string>("Payment") == "True")

                        select new
                        {
                            Name = myCustomer.Field<string>("CustomerName"),
                            OrderID = myOrders.Field<string>("OrderId")

                        };

          Console.WriteLine("Name" + "\t" + "OrderID");
          foreach (var data in results)
          {
              Console.WriteLine(data.Name + "\t" + data.OrderID);
          }

      }













Output:
Name        OrderID
John            101
Philip          101
Philip          102
Steve           101
Press any key to continue . . .


谢谢会员7900334.



[MEMBER 7900334]从其他解决方案指定的答案网站。



这个答案对他们有帮助。



Thanks MEMBER 7900334.

Answer specified by the [MEMBER 7900334] from other solution site.

This answer heer may help some one.

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; }
   }
   class CustomerOrder
   {
       public static void Main()
       {
           ProcessCustomerOrder();
       }
       public static void ProcessCustomerOrder()
       {
           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
               };
       }
   }


这篇关于LINQ QUERY BY Relational division的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆