linqクエリをフィルタリングする方法

user3070072

次の2つのパラメーターid1とid2を使用してデータをフィルター処理し、10個のレコードの正確な結果を取得できます。そのうち9個はprice_type = csで、その他はprice-type = msです。

ただし、price_typeをパラメーターid1およびid2(id1 = 23456,567890&id2 = 6782345&price_type = ms)に追加すると、1つのレコードを取得する代わりに3000のレコードを取得します。

コードに何かが欠けていますか?どんな助けでも大歓迎です。

        var data = db.database_BWICs.AsQueryable();
        var filteredData = new List<IQueryable<database_Data>>();


        if (!string.IsNullOrEmpty(query.name))
        {
            var ids = query.name.Split(',');
            foreach (string i in ids)
            {
                filteredData.Add(data.Where(c => c.Name != null && c.Name.Contains(i)));
            }
        }

        if (!string.IsNullOrEmpty(query.id2))
        {
            var ids = query.id2.Split(',');
            foreach (string i in ids)
            {
                filteredData.Add(data.Where(c => c.ID2!= null && c.ID2.Contains(i)));
            }
        }

        if (!string.IsNullOrEmpty(query.id1))
        {
            var ids = query.id1.Split(',');
            foreach (string i in ids)
            {
                filteredData.Add(data.Where(c => c.ID1!= null && c.ID1.Contains(i)));
            }
        }

        if (query.price_type != null)
        {
            var ids = query.price_type.Split(',');
            foreach (string i in ids)
            {
                filteredData.Add(data.Where(c => c.Type.Contains(i)));
            }
        }

        if (filteredData.Count != 0)
        {
            data = filteredData.Aggregate(Queryable.Union);
        }

更新されたコード:

 var data = db.database_BWICs.AsQueryable();

        if (!string.IsNullOrEmpty(query.name))
        {
            var ids = query.name.Split(',');
            data = data.Where(c => c.Name != null && ids.Contains(c.Name));
         }

        if (query.price_type != null)
        {
            var ids = query.price_type.Split(',');
            data = data.Where(c => ids.Contains(c.Cover));
        }

        if (!String.IsNullOrEmpty(query.id1))
        {
            var ids = query.id1.Split(',');
            data = data.Where(c => c.ID1!= null && ids.Contains(c.ID1));
        }
ラファエルの古い家

制限するフィルターを追加しないため、すべてのフィルターが結果にデータを追加します。

これは、ANDではなくフィルター間でORを作成することを意味します。

また、containsの使用法もかなり奇妙に見えます。使用String.Containsしているのですが、値がリストにあるかどうかを確認したいと思います(おそらく間違っています)=>Enumerable.Contains

あなたはむしろこのようなものに行くべきです(なしでfilteredData

var data = db.database_BWICs.AsQueryable();
if (!string.IsNullOrEmpty(query.name))
{
    var ids = query.name.Split(',');
    data = data.Where(c => c.Name != null && ids.Contains(c.Name)));
}
//etc.

if (query.price_type != null)
{
     var ids = query.price_type.Split(',');
     data = data.Where(c => ids.Contains(c.Type));
}

編集

まあ、あなたがミックスや条件をしたいなら、あなたはPredicateBuilderに行くことができます

次に、コードはそのようになります(テスト対象)。

//manage the queries with OR clause first
var innerOr = Predicate.True<database_BWICs>();//or the real type of your entity

if (!String.IsNullOrEmpty(query.id1))
{
    var ids = query.id1.Split(',');
    innerOr = innerOr.Or(c => c.ID1!= null && ids.Contains(c.ID1));
}
if (!String.IsNullOrEmpty(query.id2))
{
    var ids = query.id2.Split(',');
    innerOr = innerOr.Or(c => c.ID2!= null && ids.Contains(c.ID2));
}
//now manage the queries with AND clauses
var innerAnd = Predicate.True<database_BWICs>();//or the real type of your entity

if (query.price_type != null)
{
    var ids = query.price_type.Split(',');
    innerAnd = innerAnd.And(c => ids.Contains(c.Type));
}
//etc.

innerAnd = innerAnd.And(innerOr);

var data = db.database_BWICs.AsQueryable().Where(innerAnd);

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

LINQクエリをリファクタリングする方法

分類Dev

GAEクエリをフィルタリングする方法

分類Dev

DjangoORMでクエリをフィルタリングする方法

分類Dev

MySQLでクエリをフィルタリングする方法

分類Dev

子テーブルの列に基づいてLINQクエリをフィルタリングする方法は?

分類Dev

孫の itens を含めてフィルタリングする Linq クエリ

分類Dev

LINQクエリをフィルタリングしてグループ化してデータを取得する

分類Dev

linq c#でフィルタリングクエリをドリルダウンする

分類Dev

SelectListをlinqでフィルタリングする方法

分類Dev

string []をLINQでフィルタリングする方法は?

分類Dev

ROLLUPを使用してSQLクエリをフィルタリングする方法

分類Dev

フィルタリングされたデータを返すLinqクエリ

分類Dev

LINQを介してICollectionプロパティを含むクエリをフィルタリングする

分類Dev

Firebaseからクエリをフィルタリングする方法は?

分類Dev

IListサブクエリEFCore2.2をフィルタリングする方法

分類Dev

Amazon CloudwatchInsightsでサブクエリをフィルタリングする方法

分類Dev

SQLクエリ-日付行をフィルタリングする方法

分類Dev

Symfony2クエリをフィルタリングする方法

分類Dev

appengineで検索クエリをフィルタリングする方法は?

分類Dev

リストの値を使用してlinqクエリ結果をフィルタリングする

分類Dev

Linqクエリをリファクタリングする

分類Dev

C#でクエリを使用してエンティティをフィルタリングする方法は?

分類Dev

gcloudクエリでNULLをフィルタリングする

分類Dev

整数をフィルタリングするSPARQLクエリ

分類Dev

クエリ結果をフィルタリングする

分類Dev

サブクエリを作成するフィルタリング

分類Dev

Firebaseでクエリをフィルタリングする

分類Dev

linqクエリを使用してリストからフィルタリングする

分類Dev

別のリストの1つのプロパティのすべての値に基づいてlinqクエリをフィルタリングする方法

Related 関連記事

  1. 1

    LINQクエリをリファクタリングする方法

  2. 2

    GAEクエリをフィルタリングする方法

  3. 3

    DjangoORMでクエリをフィルタリングする方法

  4. 4

    MySQLでクエリをフィルタリングする方法

  5. 5

    子テーブルの列に基づいてLINQクエリをフィルタリングする方法は?

  6. 6

    孫の itens を含めてフィルタリングする Linq クエリ

  7. 7

    LINQクエリをフィルタリングしてグループ化してデータを取得する

  8. 8

    linq c#でフィルタリングクエリをドリルダウンする

  9. 9

    SelectListをlinqでフィルタリングする方法

  10. 10

    string []をLINQでフィルタリングする方法は?

  11. 11

    ROLLUPを使用してSQLクエリをフィルタリングする方法

  12. 12

    フィルタリングされたデータを返すLinqクエリ

  13. 13

    LINQを介してICollectionプロパティを含むクエリをフィルタリングする

  14. 14

    Firebaseからクエリをフィルタリングする方法は?

  15. 15

    IListサブクエリEFCore2.2をフィルタリングする方法

  16. 16

    Amazon CloudwatchInsightsでサブクエリをフィルタリングする方法

  17. 17

    SQLクエリ-日付行をフィルタリングする方法

  18. 18

    Symfony2クエリをフィルタリングする方法

  19. 19

    appengineで検索クエリをフィルタリングする方法は?

  20. 20

    リストの値を使用してlinqクエリ結果をフィルタリングする

  21. 21

    Linqクエリをリファクタリングする

  22. 22

    C#でクエリを使用してエンティティをフィルタリングする方法は?

  23. 23

    gcloudクエリでNULLをフィルタリングする

  24. 24

    整数をフィルタリングするSPARQLクエリ

  25. 25

    クエリ結果をフィルタリングする

  26. 26

    サブクエリを作成するフィルタリング

  27. 27

    Firebaseでクエリをフィルタリングする

  28. 28

    linqクエリを使用してリストからフィルタリングする

  29. 29

    別のリストの1つのプロパティのすべての値に基づいてlinqクエリをフィルタリングする方法

ホットタグ

アーカイブ