4

非常によく似たLINQクエリがいくつかあります。

var city = "Hamburg";

var query1 = 
    from c in DB.Customers
    join address in DB.Addresses on c.ID equals address.CustomerID
    where address.City == city
    select c;

var query2 = 
    from c in DB.Customers
    join address in DB.Addresses on c.ID equals address.CustomerID
    where address.City.StartsWith(city)
    select c;

etc.

ループを使用してクエリを作成し、冗長性を減らしたいと思います。

var city = "Hamburg";

var expressions = new Expression<Func<string, bool>>[] {
    a => a == city,
    a => a.StartsWith(city)
};

for(int i = 1; i <= 2; i++) {
    queries.Add(
        from c in DB.Customers
        join address in DB.Addresses on c.ID equals address.CustomerID
        where expressions[i](address.City) 
        select c
        );
}

しかし、今は式の配列を作成する方法がわかりません。何か案が?

4

4 に答える 4

3

Joinクエリ構文を使用する代わりに、メソッドを直接使用できます。

public IQueryable<Customer> FindCustomers(Expression<Func<Customer, Address, bool>> predicate)
{
    return DB.Customers.Join(DB.Addresses, c => c.ID, a => d.CustomerID, (c, a) => new { Address = a, Customer = c})
        .Where(pair => predicate(pair.Address))
        .Select(pair => pair.Customer)
}

Customerまたは、との両方を渡すことができますAddress

public IQueryable<Customer> FindCustomers(Expression<Func<Customer, Address, bool>> predicate)
{
    return DB.Customers.Join(DB.Addresses, c => c.ID, a => d.CustomerID, (c, a) => new { Address = a, Customer = c})
        .Where(pair => predicate(pair.Customer, pair.Address))
        .Select(pair => pair.Customer)
}

次に、次のように配列を作成できます。

IQueryable<Customer>[] queries = expressions.Select(expr => FindCustomers(expr)).ToArray();
于 2013-01-09T13:26:10.133 に答える
3
var city = "Hamburg";

// predicate should accept Address
var expressions = new Expression<Func<Address, bool>>[] {
    a => a.City == city,
    a => a.City.StartsWith(city)
};

foreach(var predicate in expressions) {
    queries.Add(
        DB.Customers.Join(
           DB.Addresses.Where(predicate), // filtering here
           c => c.ID, 
           a => a.CustomerID, 
           (c, a) => c) // return customer
    ));
}
于 2013-01-09T13:31:57.470 に答える
1

共通の結合部分を共通のクエリに保存できます。

var query = from c in DB.Customers
         join address from DB.Addresses on c.ID equals address.CustomerID
         select new {A=a, C=c};
var query1 = query.Where ( item => item.A.temp == item.C.test).Select (item => item.C);
var query2 = query.Where ( item => item.A.temp2 == item.C.test2).Select (item => item.C);
于 2013-01-09T13:25:50.453 に答える
1
var queries=(
    from f in
        new Func<Address, bool>[] { 
            x => x.City==city, 
            x => x.City.StartsWith(city)
            }
    select
        from c in DB.Customers
        join address in DB.Addresses on c.ID equals address.CustomerID
        where f(address)
        select c
    ).ToArray();
  1. あなたはを作成しています、それはあなたが結局のところexpression array結果を出していることを意味します。expression arrayデリゲートをにする必要はありませんexpression array

  2. あなたは必要ありませんforeach

  3. 後でさらに式を追加する場合はqueries、に変更ToArray()します。ToList()

  4. Func<Address, bool>を生成する前に変更を加えたい場合はqueries、そのローカル変数を定義し、Func<Address, bool>[]

于 2013-01-09T13:58:05.893 に答える