私は作業しているlinqpadスクリプトを持っていますが、問題はそのコレクションをメモリに呼び出す.AsEnumerable()
を使用していることです。これらのうち何千ものものがあるかもしれないので、私はできるだけすべてを延期したいと思います。レコードにすべてのリレーションシップがあることを保証します。
私は単に私が関数にnew long[] { 2, 4 }
を渡す場合は必ず、その後、 IDが2と4の両方を持っている任意の経験が返されるようにするのチェックを実行しようとしています。
以前、私は.Contains()
を使用していたが、これは経験を持ってのいずれか 2または
4.それはIQueryable<Experience>
を返すのではなくなるようにこのコードを書くためのより良い方法はありますが返されますa List<Experience>
ですから、文字列の連結を実行するためにすべての結果をメモリにロードする必要はありませんか?
void Main()
{
var AllExperiences = new List<_Experience>();
AllExperiences.Add(new _Experience { Id = 1, Name = "Experience 1" });
AllExperiences.Add(new _Experience { Id = 2, Name = "Experience 2" });
AllExperienceTags.Add(new _ExperienceTag { ExperienceId = 1, TagId = 2 });
AllExperienceTags.Add(new _ExperienceTag { ExperienceId = 1, TagId = 4 });
AllExperienceTags.Add(new _ExperienceTag { ExperienceId = 2, TagId = 2 });
var experiences = FilterBySelectedTags(AllExperiences, new[] { 2, 4 }.ToList());
experiences.Dump();
}
public List<_ExperienceTag> AllExperienceTags = new List<UserQuery._ExperienceTag>();
// Define other methods and classes here
public List<_Experience> FilterBySelectedTags(List<_Experience> experiences, List<int> selectedTagIds)
{
var filteredExperiencesTags = AllExperienceTags.Where(x => selectedTagIds.Contains(x.TagId));
var obj = filteredExperiencesTags.OrderBy(x => x.TagId).GroupBy(x => x.ExperienceId).AsEnumerable().Select(x => new
{
ExperienceId = x.Key,
ExpTags = string.Join(", ", x.Select(y => y.TagId))
});
var filteredTags = obj.Where(x => x.ExpTags == string.Join(", ", selectedTagIds));
// make sure all the selected tags are found in the experience, not just any
return experiences.Where(x => filteredTags.Select(y => y.ExperienceId).Contains(x.Id)).ToList();
}
public class _Experience
{
public int Id { get; set; }
public string Name { get; set; }
}
public class _ExperienceTag
{
public int ExperienceId { get; set; }
public int TagId { get; set; }
}
「Experience」クラスの宣言を共有できますか? –
@ThomasAyoub完全に分離されたコードで質問を更新しました。実行すると、1つの結果が返されます。 2番目のパラメータを '{2、4}'から '{2} 'に変更すると、期待通りに2つの結果が返されます。 – user1477388