1

私はまったく同じように見えます

さまざまなレベルで子のフィルターを使用して効率的にクエリを実行する方法は?

しかし、「ラムダ」構文です。

私は本当にこれが必要です、誰か助けてくれますか? ありがとう!

4

1 に答える 1

4

クエリ構文とラムダ構文の両方で参照した投稿のコードスニペットは次のとおりです。https ://stackoverflow.com/a/12324116/670028 :

LINQクエリ構文:

var listOfString = new List<string>() { "String1", "String2" };

var customers =
(
    from a in session.Query<A>()
    from b in a.B
    from c in b.C
    where a.Status == "Active"
            && listOfStrings.Contains( b.SomeField )
            && listOfStrings.Contains( c.someOtherField )
    select a )
    .ToList();

LINQラムダ構文:

var listOfString = new List<string>() { "String1", "String2" };

var customers =
    (
        session.Query<A>()
            .SelectMany( a => a.B, ( a, b ) => new { a, b } )
            .SelectMany( @t => b.C, ( @t, c ) => new { @t, c } )
            .Where( @t => a.Status == "Active"
                            && listOfStrings.Contains( b.SomeField )
                            && listOfStrings.Contains( c.someOtherField ) ).
            Select
            ( @t => a ) )
        .ToList();

ご覧のとおり、.SelectMany()メソッドを使用するたびに新しい匿名型に投影し続ける必要があるため、LINQクエリ構文ほど「クリーン」ではありません。また、これらすべての変数名と少し混乱する可能性があるため、このようなクエリを実行する必要がある場合は、ラムダではなくLINQクエリ構文を使用する傾向があります。

楽しみのために、匿名タイプにもっと意味のある名前を付けることで、少し見栄えが良く、より現実的に見える.SelectMany()の使用例を次に示します。

public void Get_StarPowerCorporations_PendingShipment_Orders_Shipping_To_NewYork_Or_Chicago()
{
    var session = UnitOfWork.Current.GetSession();

    var listOfCities = new List<string> { "New York", "Chicago" };

    var customerAndOrders = session.Query<Customer>()
        .SelectMany( c => c.Orders, ( Customer, Orders ) => new { Customer, Orders } )
        .SelectMany( CustomerAndOrders => CustomerAndOrders.Orders.OrderDetails, ( CustomerAndOrders, OrderDetails ) => new { CustomerAndOrders, OrderDetails } )
        .Where( x => x.CustomerAndOrders.Customer.CompanyName == "StarPower Corporatation"
                        && x.CustomerAndOrders.Orders.Status == "Pending Shipment"
                        && listOfCities.Contains( x.OrderDetails.City ) )
        .Select( x => x.CustomerAndOrders.Customer )
        .Fetch( x => x.Orders )
        .ToList();
}

public class Customer
{
    public int CustomerId { get; set; }
    public string CompanyName { get; set; }
    public IList<Address> Addresses { get; set; }
    public IList<Order> Orders { get; set; }
}

public class Address
{
    public int AddressId { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public string Status { get; set; }
    public IList<OrderDetail> OrderDetails { get; set; }
}

public class OrderDetail
{
    public int OrderDetailId { get; set; }
    public string City { get; set; }
}
于 2012-11-14T17:50:58.470 に答える