0

次のクエリを Linq to Entities に変換するのに助けが必要です。

select * from tableA a join 
tableB b on a.ProductId = b.ProductId and a.UserId = b.UserId
where a.ProductId = 60244
and ((b.Column1 = 33 and b.Column2 >= 3) or (b.Column1 = 24 and b.Column2 >= 2))

この式から始めましたが、リストに基づいて tableB の複雑な条件を作成する方法がわかりません。predicatebuilder のパターンに従おうとしましたが、例が結合されたテーブルを扱っていないため、障害にぶつかりました。

public IList<tableA> GetSomeStuff(int productId, List<tableB> filters)
{
    var query = from a in tableA
        join b in tableB
        on new
        {
            ProductId = a.ProductId,
            UserId = a.UserId
        }
        equals
        new
        {
            ProductId = b.ProductId,
            UserId = b.UserId
        }
        where a.ProductId == 6544
        select a;


    var tableBPredicate = PredicateBuilder.True<tableB>();
    foreach (var filter in filters)
    {
        /* build up tableB conditions here */
        tableBPredicate = tableBPredicate.And(p => p.Column1 == filter.Column1);
        tableBPredicate = tableBPredicate.And(p => p.Column2 => filter.Column2);
    }

    // this won't compile because query is of type tableA and not tableB
    return query.AsExpandable().Where(tableBPredicate).ToList();
}
4

1 に答える 1

1

最初に述語を適用してから、フィルター処理されたセットを他のテーブルに結合すると機能するはずです。

var tableBPredicate = PredicateBuilder.True<tableB>();
foreach (var filter in filters)
{
    /* build up tableB conditions here */
    tableBPredicate = tableBPredicate.And(p => p.Column1 == filter.Column1);
    tableBPredicate = tableBPredicate.And(p => p.Column2 => filter.Column2);
}

var tableBQuery = tableB.AsExpandable().Where(tableBPredicate);

var query = from b in tableBQuery
    join a in tableA
    on new
    {
        ProductId = b.ProductId,
        UserId = b.UserId
    }
    equals
    new
    {
        ProductId = a.ProductId,
        UserId = a.UserId
    }
    where a.ProductId == 6544
    select a;

return query.ToList();
于 2013-09-15T15:22:34.777 に答える