0

レコードをフィルタリングするクエリを作成する必要があります。異なるレコードを取得する場合、これらのレコード情報を異なる条件で取得します。また、これらを動的にする必要があります(最初の選択で数量フィルター)

例を示しましょう。

私は2つのテーブルを持っています:

tbl顧客:

id    customerName  
1        John  
2        Philip  
3        Steve

tblOrders

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=TrueorderIdを気にせずに 全てのレコードを受け取りたい

私は取得する必要があります:

john    100
john    101  
Philip  101
Philip  102    

クリアリング: 2 つのステップが必要です。最初に、orderId=101&102 を持つ顧客をフィルター処理し、2 番目のステップで、これらの選択した顧客の orderId のうち、どの支払いが true であるかを表示したいと考えています。たとえば、最初のステップで john (注文 ID = 101&102 を持つ人) を取得し、john 100 - john 101 (支払いは true) を表示します。tblorder.id=1 は最初のクエリではなく、最終結果に表示する必要があると考えてください。

@Raphael は、より良い表現を教えてくれます。注文した顧客 (101 & 102) のすべての支払いの真の注文を確認したいです。ただし、orderids は 2 を超える場合があります (@Raphael に感謝)。

2 番目の問題は、動的でなければならないことです。チェックする必要がある orderId が 10 個を超える場合もあれば、それ以下の場合もあります。つまり、クエリは柔軟でなければなりません。

SQL Server の select コマンドでは、文字列変数を用意して使用できますが、linq ではできません。

4

2 に答える 2

1

あなたの投稿とコメントから私が理解したことから、orderId が 101 または 102 で、支払いが true であるすべての顧客が必要です。

クエリの外部でチェックする Id を変更できるように、orderIds を含む where 句を動的にする必要があります。

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
                          //...
                        }

これにより、チェックする必要があるすべての orderIds をリストに保存し、コードから編集することができます。

編集 私は本当にあなたの問題に対するきれいな解決策を見つけていないので、迂回しました。これはあまりきれいではありませんが、うまくいくはずです。私の例では、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() 行は無視してください。Visual Studio では動作しません。

于 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 に答える