1

フィルタリングする小さなリクエスト オブジェクトがあります。

public class BufferFlatViewFilter
{
    public bool? Active { get; set; }
    public int? CustomerId { get; set; }
    public int? TypeId { get; set; }
}

そして、db リクエストの where フィルターを構築する必要があります。

Entity フレームワークを使用して、Where ステートメントをそのように構築することができました。

public List<BufferFlatView> GetBufferFlatView(BufferFlatViewFilter filter)
{
    var data = db.qryCampaignOverView
        .AsQueryable();

    if (filter.TypeId.HasValue)
        data = data.Where(x => x.TypeId == filter.TypeId.Value);

    if (filter.CustomerId.HasValue)
        data = data.Where(x => x.CustomerId == filter.CustomerId);

    if (filter.Active)
        data = data.Where(x => x.Active == filter.Active);

    return data.ToList();
}

エンティティ フレームワーク クエリは遅延ロードされますが、OrmLight クエリではないため、OrmLight の where ステートメントを作成する方法がわかりません。

4

2 に答える 2

2

最近、OrmLite ExpressionVisitor に式の連鎖を追加しました - ユニット テストからコードをコピーして貼り付けます。

var visitor = dbConnection.CreateExpression<Person>();
visitor.Where(x => x.FirstName.StartsWith("Jim")).And(x => x.LastName.StartsWith("Hen"));
var results = db.Select<Person>(visitor);
Assert.AreEqual(1,results.Count);

visitor.Where(x => x.Age < 30).Or(x => x.Age > 45);
results = db.Select<Person>(visitor);
Assert.AreEqual(5, results.Count);
Assert.IsFalse(results.Any(x => x.FirstName == "Elvis"));

注: Where(x => predicate) と .And(x => predicate) は機能的に同じです。

Order By式を構築することもできます

visitor.OrderBy(x => x.Name).ThenByDescending(x => x.Age);

だからあなたのコードは

public List<BufferFlatView> GetBufferFlatView(BufferFlatViewFilter filter)
{
    //assumes IDbConnection instance injected by IOC
    var ev = dbConnection.CreateExpression<Campaign>();

    if (filter.TypeId.HasValue)
        ev.Where(x => x.TypeId == filter.TypeId.Value);

    if (filter.CustomerId.HasValue)
        ev.Where(x => x.CustomerId == filter.CustomerId);

    if (filter.Active)
        ev.Where(x => x.Active == filter.Active);

    return dbConnection.Select<Campaign>(ev);

}

于 2012-12-09T20:24:32.937 に答える
0

このようなことができます。

public class Poco
    {
        public int TypeId { get; set; }
        public int CustomerId { get; set; }
        public bool Active { get; set; }
    }

public class Filter<T>
{
    private List<Func<T, bool>> filters = new List<Func<T, bool>>();

    public void AddFilter(Func<T, bool> filter)
    {
        this.filters.Add(filter);
    }
    public bool PredicateFilter(T item)
    {
        return filters.All(x => x(item));
    }
}

static void Main(string[] args)
{

    var list = new List<Poco>() { new Poco { Active = true, CustomerId = 1, TypeId = 1 } };

    var filter = new Filter<Poco>();
    filter.AddFilter(x => x.Active == false);
    filter.AddFilter(x => x.CustomerId == 1);
    filter.AddFilter(x => x.TypeId == 1);

    var item = list.Where(x => filter.PredicateFilter(x));


    Console.Read();

}
于 2012-12-08T19:34:24.910 に答える