2

私は次の3つのテーブルとの関係を取得しました:m-

データベースモデル

Activities次に、選択したリストがCharacteristics添付されているすべてのクエリを実行します。

私の質問:

e.QueryableSource = _dataContext.Activities.Where(ac => 
                ac.UserId == _userId && 
                ac.ResubmissionDate <= EntityFunctions.TruncateTime(_to) && 
                ac.Priority <= (int)_prio && 
                ac.CompletedDate == null && 
                ac.Characteristics.Contains(CharacFilter));

タイプのアイテムではなく、タイプのac.Characteristics.Contains()アイテムを期待するように、それは悲しいことに機能しませんActivityCharacteristicsCharacteristic

どうすればそれを達成できますか?

サイドノード:排他的なフィルタリングは必要ありません。たとえば、で3つの特性を指定する場合CharacFilter、これら3つの特性のいずれか(必ずしもすべてではない)が付加されている可能性のあるすべてのアクティビティをクエリします。

編集: CharacFilterは、private IEnumerable<int> CharacFilter { get; set; } これらの特性を選択してビュー変数で保持するビューから入力されていますpublic List<Characteristic> SelectedCharacteristics { get; set; }

私の割り当て:

        var view = new AssignCharacteristicsView();
        view.ShowDialog();

        if (view.SelectedCharacteristics != null)
        {
            CharacFilter = view.SelectedCharacteristics.Select(cf => cf.Id);
        }

`

4

1 に答える 1

4

の場合CharacFilterIEnumerable<Characteristics>、次のことを試すことができます。

IEnumerable<int> charaFilters = CharacFilter.Select(cf => cf.Id);

e.QueryableSource = _dataContext.Activities.Where(ac => 
    ac.UserId == _userId && 
    ac.ResubmissionDate <= EntityFunctions.TruncateTime(_to) && 
    ac.Priority <= (int)_prio && 
    ac.CompletedDate == null &&
    ac.Characteristics.Any(acc => characFilters.Contains(acc.CharacteristicId)));

accタイプActivityCharacteristicsです。)

そしてActivity.Characteristics、実際には、エンティティで名前Activity.ActivityCharacteristicsを付けたような名前にする必要があります。Characteristicsそうでなければかなり混乱します。

編集

あなたの例外について

タイプ'System.Collections.Generic.IEnumerable´1'の定数値を作成できません

の場合、EFCharacFilterが作成できない定数値であるnullため、実際にこの例外が発生します。式で使用してnullいるため、はスローされません。あなたの編集したコードによると、質問はifである可能性があります。NullReferenceExceptionCharacFilterCharacFilternullview.SelectedCharacteristicsnull

問題を解決するには、アプリケーションのすべての特性を意味するか、まったく意味しないnullかに応じて、ケースをキャッチする必要があります。それが何も意味しない場合は、空のリストをインスタンス化することをお勧めします。view.SelectedCharacteristics == null

if (view.SelectedCharacteristics != null)
{
    CharacFilter = view.SelectedCharacteristics.Select(cf => cf.Id);
}
else
{
    CharacFilter = new List<int>();
}

それがあなたが試すことができるすべての特徴を意味するならば:

// ...
ac.Characteristics.Any(acc => (characFilters != null
    ? characFilters.Contains(acc.CharacteristicId)
    : true)));

編集2

最後のオプションは同じ例外をスローします(定数値と比較するには、再度作成する必要があるため、驚くことCharacFilternullはありません)。代替案(isの場合は最後のWhere句を省略してください):CharacFilternull

ObjectQuery<Activity> query = _dataContext.Activities.Where(ac => 
    ac.UserId == _userId && 
    ac.ResubmissionDate <= EntityFunctions.TruncateTime(_to) && 
    ac.Priority <= (int)_prio && 
    ac.CompletedDate == null);

if (characFilters != null)
{
    query = query.Where(ac => ac.Characteristics
                     .Any(acc => characFilters.Contains(acc.CharacteristicId)));
}

e.QueryableSource = query;
于 2012-07-11T18:54:55.287 に答える