3

このフィルターに以下を追加する必要があります、

「渡されたCountryIDが(999)に等しい場合、検索では国でフィルタリングするのではなく、すべての国を検索する必要があります。」

私が現在持っているのはこれです、それは私を完全に混乱させます。

var query = rep.
    FindWhere(c => 
        (
            countryID.HasValue == false || 
            c.CityID == null || 
            c.Countries.ID == countryID
        )
        && 
        (
            mediaTypeID == 0 || 
            c.MediaTypeID == mediaTypeID
        ) 
        && c.Active);

最初の括弧の条件に当てはまるものがあれば、それはすべての国と一致すると思いますか?!もしそうなら、countryID 999をチェックするために最初の括弧に式を追加できますか?

ps。FindWhereは次のとおりです。

public IQueryable<T> FindWhere(Expression<Func<T, bool>> predicate) 
{
    return _dbSet.Where(predicate);
}
4

2 に答える 2

4
rep.FindWhere(c => (c.CityID == null || !countryID.HasValue ||
                    countryID == 999 || c.Countries.ID == countryID) &&
                   (mediaTypeID == 0 || c.MediaTypeID == mediaTypeID))

ところで、あなたの条件ロジックは本当に理解するのが難しいです。コードをリファクタリングすることを検討してください。

于 2013-03-26T15:08:06.597 に答える
3

最初の括弧の条件に当てはまるものがあれば、それはすべての国と一致すると思いますか?!もしそうなら、countryID 999をチェックするために最初の括弧に式を追加できますか?

これは機能するはずです。現在、述語では、最初の3つの条件のいずれかが真である(countryIDisnullまたは指定された国、または都市がであるnull)必要があり、次に2番目の条件のいずれかをチェックします。

999に対するチェックを追加すると、国のチェックに999を使用した場合、最初の基準が常に合格し、フィルターが効果的に「削除」されます。

そうは言っても、私は個人的にこれを分割したいと思います。すでにを使用しているのでIQueryable<T>、フィルターを選択的に追加できます。

var query = rep.FindWhere(c => c.Active);
if (mediaType != 0)
    query = query.Where(c => c.MediaTypeID == mediaTypeID);
if (countryID != 999)
    query = query.Where(c => countryID.HasValue == false || c.CityID == null || c.Countries.ID == countryID);

これはより効率的ですが(必要な場合にのみフィルターを追加します)、理解しやすくなります。

于 2013-03-26T15:07:01.717 に答える