0

我有一个简单的课程:

public class User : ActiveRecordLinqBase<User>
{
    [PrimaryKey(Column = "user_id", Length = 20)]
    public string Id { get; set; }

    [Property(Column = "password", Length = 16)]
    public string Password { get; set; }
    ...
}

我创建了以下存储库:

public class SqlRepository<T> : IRepository<T> where T : ActiveRecordLinqBase<T>, new() {
    public void Add(T entity) {
        entity.SaveAndFlush();
    }

    public void Remove(T entity) {
        entity.DeleteAndFlush();
    }

    public void Modify(T entity) {
        entity.UpdateAndFlush(); ;
    }

    ...

    public IEnumerable<T> FindAll(Func<T, bool> predicate) {
        return ActiveRecordLinqBase<T>.Queryable.Where(predicate);
    }
}

现在,在运行以下单元测试时(针对 MySQL 数据库):

[Test]
public void Test_Sample() {
    var repo = new SqlRepository<T>();
    repo.Add("john.doe", "keyword1");
    repo.Add("other.user", "keyword2");

    var users = repo.FindAll(x => x.Username.Contains("john")).ToList();

    Assert.AreEqual(1, users.Count);
}

...我得到以下 SQL 查询:

选择 this_.user_id 作为 user1_0_0_,this_.password 作为 password0_0_,this_.role 作为 role0_0_ FROM users this_

条款在哪里WHERE

如果我直接在同一个测试中执行以下操作...

var users = User.Queryable.Where(x => x.Username.Contains("john"));

我得到以下 SQL:

选择 this_.user_id 作为 user1_0_0_, this_.password 作为 password0_0_, this_.role 作为 role0_0_ FROM users this_ WHERE this_.user_id like ?p0;?p0 = '%john%'

难道我做错了什么?

这两个查询有什么区别?


编辑:我也试过

return ActiveRecordLinq.AsQueryable<T>().Where(predicate);

没有成功。

4

1 回答 1

3

现在这只是因为我喜欢代码,有时我会注意到一些东西......我不是 Active Record 方面的专家,所以这只是一个猜测......

也许您应该将FindAll方法的签名从

public IEnumerable<T> FindAll(Func<T, bool> predicate)

进入

public IEnumerable<T> FindAll(Expression<Func<T, bool>> predicate)

这将允许您达到正确的过载Where,这很可能是您正在寻找的过载。

这是因为Func不能以同样的方式反映Expression of Func罐头。

于 2012-09-27T05:08:25.353 回答