3

LINQ を使用してかなり単純にする必要があるものを概念化するのに問題があります。子オブジェクトの ID 値に基づいて、絞り込みまたはフィルター処理したいコレクションがあります。

私の主なコレクションは、スポットのリストで構成されています。スポットはこんな感じ。

public class Spot
{
    public virtual int? ID { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual string TheGood { get; set; }
    public virtual string TheBad { get; set; }
    public virtual IEnumerable<Season> Seasons { get; set; }
    public virtual IEnumerable<PhotographyType> PhotographyTypes { get; set; }
}

写真の種類と季節でスポットのリストをフィルタリングしようとしています。PhotographyTypes と Seasons の ID のリストがあり、それぞれが int[] 配列になっています。これらのリストは次のようになります。

criteria.PhotographyTypeIds //an int[]
criteria.SeasonIds //an int[]

上記のリストに一致する子オブジェクト (id) を持つスポットのみを含むコレクションを構築したいと考えています。この機能の目的は、一連の写真スポットを種類と季節でフィルタリングし、一致するものだけを表示することです。どんな提案でも大歓迎です。

4

3 に答える 3

1

提案をありがとうございました。私は問題を解決することになりました。それは私が確信している最善の方法ではありませんが、現在は機能しています。これは検索フィルターなので、条件がたくさんあります。

private List<Spot> FilterSpots(List<Spot> spots, SearchCriteriaModel criteria)
    {
        if (criteria.PhotographyTypeIds != null || criteria.SeasonIds != null)
        {
            List<Spot> filteredSpots = new List<Spot>();

            if (criteria.PhotographyTypeIds != null)
            {
                foreach (int id in criteria.PhotographyTypeIds)
                {
                    var matchingSpots = spots.Where(x => x.PhotographyTypes.Any(p => p.ID == id));
                    filteredSpots.AddRange(matchingSpots.ToList());
                }
            }

            if (criteria.SeasonIds != null)
            {
                foreach (int id in criteria.SeasonIds)
                {
                    if (filteredSpots.Count() > 0)
                    {
                        filteredSpots = filteredSpots.Where(x => x.Seasons.Any(p => p.ID == id)).ToList();
                    }
                    else
                    {
                        var matchingSpots = spots.Where(x => x.Seasons.Any(p => p.ID == id));
                        filteredSpots.AddRange(matchingSpots.ToList());
                    }
                }
            }
            return filteredSpots;
        }
        else
        {
            return spots;
        }
    }
于 2013-04-14T21:50:42.673 に答える
0

ContainsID がリストにあるときに返される拡張メソッドを持つ ID の配列がありtrueます。LINQ と組み合わせると、次のWhereようになります。

List<Spot> spots;   // List of spots
int[] seasonIDs;    // List of season IDs

var seasonSpots = from s in spots
                  where s.ID != null
                  where seasonIDs.Contains((int)s.ID)
                  select s;

必要に応じて、返さIEnumerable<Spot>れたものをリストに変換できます。

var seasonSpotsList = seasonSpots.ToList();
于 2013-04-14T07:26:17.137 に答える
0

これはあなたを助けるかもしれません:

List<Spot> spots = new List<Spot>();
Spot s1 = new Spot();
s1.Seasons = new List<Season>() 
             { new Season() { ID = 1 }, 
               new Season() { ID = 2 }, 
               new Season() { ID = 3 } 
             };
s1.PhotographyTypes = new List<PhotographyType>() 
             { new PhotographyType() { ID = 1 }, 
               new PhotographyType() { ID = 2 } 
             };

Spot s2 = new Spot();
s2.Seasons = new List<Season>() 
             { new Season() { ID = 3 }, 
               new Season() { ID = 4 }, 
               new Season() { ID = 5 } 
             };
s2.PhotographyTypes = new List<PhotographyType>() 
             { new PhotographyType() { ID = 2 }, 
               new PhotographyType() { ID = 3 } 
             };

List<int> PhotographyTypeIds = new List<int>() { 1, 2};
List<int> SeasonIds = new List<int>() { 1, 2, 3, 4 };

spots.Add(s1);
spots.Add(s2);

それで:

var result = spots
             .Where(input => input.Seasons.All
                           (i => SeasonIds.Contains(i.ID)) 
                    && input.PhotographyTypes.All
                           (j =>  PhotographyTypeIds.Contains(j.ID))
                    ).ToList();
// it will return 1 value 

仮定:

public class Season
{
    public int ID { get; set; }
    //some codes
}
public class PhotographyType
{
    public int ID { get; set; }
    //some codes
}
于 2013-04-14T06:00:29.650 に答える