2016-07-21 4 views
3

フィードバックカードを追跡する同僚から継承したアプリケーションがあります。私はまた、いくつかのユーザー入力フィルターに基づいてWebページに表示されるカードをフィルターするフォームを持っています。フィードバックの詳細(サービスは良い/悪い、部屋はきれいだった/汚れていたなど)に対して適用されているフィルタを除いて、すべてのフィルタは正常に動作します。これらは、私のカードクラスのメンバークラスのリストに格納されています。メンバーオブジェクトリストに対するLINQクエリのフィルタリング

以下は、各クラスのスニペットのセットです。

public class Card { 
    public long ID { get; set; } 
    public List<Feedback> feedback { get; set; } 

    ... 
} 

public class Feedback { 
    public long ID {get; set; } 

    ... 
} 

public class CardFilter { 
    public ICollection<long> FeedBackDetails {get; set; } 

    ... 
} 

... 
public IQueryable<CardType > GetFeedbackQueryable<CardType>(CardFilter filter = null) 
     where CardType : Card 
{ 
    var data = Service.GetRepository<CardType>(); 
    var CardQuery = data.All; 
    ... 
    if (filter.FeedbackDetails != null && filter.FeedbackDetails.Count != 0) 
    { 
     cardQuery = cardQuery.Where(card => card.FeedbackValues) 
          .All(fbv => filter.FeedbackDetails.Contains(fbv.ID)); 
    } 
    return cardQuery; 
} 
... 

私はフィルタしてみてください:それは、任意のフィードバックなしで15カードのインスタンスを返します

cardQuery = cardQuery.Where(card => card.FeedbackValues) 
        .All(fbv => filter.FeedbackDetails.Contains(fbv.ID)); 

を。フィルタを使用している場合:

cardQuery = cardQuery.Where(card => card.FeedbackValues) 
        .Any(fbv => filter.FeedbackDetails.Contains(fbv.ID)); 

データを見て適切なカードを参照することはできますが、何も返されません。

私はLINQを新しくしているので、私は何か不足していることを知っています。ここで正しい方向に私を指摘してください。

EDIT:

このアプリケーションにもう少し背景を与えるために、私は少しより冗長になるでしょう。カードテーブル/モデルには、カードとそのカードを提出する人に関する情報があります。それは私が名前や匿名、住所、コメントされている場所、その他いくつかの基本的な事実を意味します。フィードバック項目は、別の表にリストされ、Webフォームに表示され、ユーザーはそれぞれに対して正か負かをチェックできます。フィードバックの詳細ごとに3つの可能な回答があります。 0(正)、1(負)または無(無回答)。

カードモデルには、すべての基本カード情報とフィードバック応答の集合が含まれています。私に迷惑をかけている私のフィルタは、その回答の集合に対するものです。各カードには0から52の回答があり、すべての状況に適用されない可能性があります。したがって、肯定的であれ否定的であれ、特定の状況(清潔さなど)に関するすべてのカードを見る必要があります。これがこのフィルターの目的です。

+0

正確にクエリを取得しようとしていますか? –

+1

私はあなたの2番目のクエリがあなたが探しているものに近いと思っています(.Anyの前の括弧がそこにあるべきではないにもかかわらず)。それは、「フィードバック値の少なくとも1つのIDがフィルタのフィードバックの詳細に含まれているすべてのカードを私に渡してください」と言っています。それはあなたがやろうとしていることですか? –

+0

これは 'All'を使ってコンパイルしましたか? 'IQueryable 'は、[Enumerable.All](https://msdn.microsoft.com/en-us/library/bb548541%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396)とは異なる署名を提供しますか? )?これは 'bool'を返し、' cardQuery'に代入することができないからです。 – geniusburger

答えて

0

これを解決できました。投稿されたすべての回答が正しい方向に私を助けました。私は彼らをすべて答えにしてもいいと思う。

フィードバックモデルを少し修正して、データベースから別のIDフィールドを追加しました。それは既存の日付を複製しました(悪いデザイン、私は知っています、それは私ではありませんでした)が、ユニークな名前を持っていました。新しいフィールドを使用して、Anyフィルタを適用することができました。私はIDと呼ばれる複数のフィールドとLINQを混同していたと思います。フィードバックIDを使用すると、うまくいきました。

0

allステートメントを使用することはできません。このステートメントの述部は、すべての値がidと同一である場合です。

フィルタ句であるwhere文では、何もフィルタリングしていませんか?

フィードバックIDとIDを比較していますか?彼らは同じですか? はあなたが

に関するいくつかの詳細を投稿することができます多分試してみてください。

cardQuery = cardQuery.Where(card => filter. FeedbackDetails.Contains(card. Id/detsils)) 
        .Select(se=> se).Tolist() ; 
+1

私のところでは、フィードバックの詳細をフィルタリングしようとしています。完了できるフィードバックの詳細はデータベーステーブルにあるため、常にIDと対応するカードがあります。フィードバックの詳細はカードクラスのリストなので、私はこれを行うことはできません: cardQuery = cardQuery.Where(カード=> filter.FeedbackDetails.Contains(card.FeedbackValues.ID))...私は使用する必要がありますIDのどこにアクセスするかを指定します。 –

1

はこれを試してみてください。私はあなたのフィルタobjについて完全にはわかりませんが。

cardQuery = cardQuery.Query().Select(card => card.FeedbackValues).Where(fbv => filter.FeedbackDetails.Contains(fbv.ID)); 
+0

選択に使用できるQuery()メソッドはありません。私はcardQuery.Select(card => card.FeedBackValues)を試しました。どこか(fbv => filter.FeedbackDetails.Contains(fbv.ID)); System.Collections.Generic.ICollection 'に' ID 'の定義がなく、' System.Collections.Generic.ICollection '型の最初の引数を受け入れる拡張メソッド' ID 'が含まれていません。 (使用しているディレクティブやアセンブリ参照がありませんか?) –

+0

oops、 'Query()'ステートメントを間違って配置しました。ハハ、あなたはすでにあなたの問題を解決しましたか? – Barak

2

var ifExist = YourList.Any(lambda expression)YourList<T>がwhitch fulifillのラムダ式オブジェクトが含まれているかどうかをチェックします。返品はtrueまたはfalseです。あなたがオブジェクトのリストを持っている場合は、var YourNewList = YourList.Where(lambda expression).ToList()を使うべきです。

関連する問題