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%'

私は何か間違ったことをしていますか?

これら2つのクエリの違いは何ですか?


編集:私も試しました

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 に答える