0

私はC# に尋ねた前の質問に似た問題を解決しようとしています - 引数としてオブジェクト プロパティを派生させるために関数を渡すが、エンティティ フレームワークを操作するため

private IQueryable<Foo> Query(Query query)
{
    string[] searchTerms = query.CsvData.Replace(" ", "").ToLower().Split(',');

    switch (query.Type)
    {
        case QueryType.Name:
            return dbContext.Foos.Where(ByName(query.Exclude, searchTerms));

        case QueryType.Street:
            return dbContext.Foos.Where(ByStreet(query.Exclude, searchTerms));
    }
}

そして、私は次の2つの機能を持っています

private Expression<Func<Foo, bool>> ByName(bool _exclude, string[] _searchTerms)
{
    if (_exclude)
    {
        return x => !_searchTerms.Contains(x.Name.Replace(" ", "").ToLower());
    }

    return x => _searchTerms.Contains(x.Name.Replace(" ", "").ToLower());
}

private Expression<Func<Foo, bool>> ByStreet(bool _exclude, string[] _searchTerms)
{
    if (_exclude)
    {
        return x => !_searchTerms.Contains(x.Address.Street.Replace(" ", "").ToLower());
    }

    return x => _searchTerms.Contains(x.Address.Street.Replace(" ", "").ToLower());
}

これは問題なく機能しますが、検索するすべての異なるプロパティに対して多くのコードが繰り返されます。プロパティ文字列を渡して一般的にクエリできるようにすることで、これをより一般的にしたいと思います。

他の質問はストレートlinqでうまく答えますが、linq-to-sqlでこれを達成できるようにしたいと思います

独自のカスタム式を作成する必要がありますか?

4

0 に答える 0