我有一个简单的课程:
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);
没有成功。
答案 0 :(得分: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
相同的方式反映出来。