Dynamic Linqとエンティティフレームを使用して、以下のコードを作成します。
private void ComboBox_DropDown(object sender, EventArgs e)
{
ComboBox cb1 = (ComboBox)sender;
string SelectField = cb1.Name.Substring(2);
var query = MyContext.Items.Select(SelectField);
foreach (ComboBox cb2 in gbFilters.Controls.OfType<ComboBox>().Where(com => com.Text != ""))
{
string propertyName = cb2.Name.Substring(2);
string propertyValue = cb2.Text;
query = query.Where(propertyName + "=@0", propertyValue);
}
var x = query;
x = x.Provider.CreateQuery(
Expression.Call(
typeof(Queryable), "Distinct",
new Type[] { x.ElementType },
x.Expression));
foreach (var y in x)
{
if (y != null)
cb1.Items.Add(y.ToString());
}
}
主な焦点はforeach部分です。他のすべてが正常に動作するようです。しかし、値を持つ別のドロップダウンがある場合、エラーが発生します。 「プロパティまたはフィールド 'Color'はタイプ 'String'に存在しません」およびColorは任意のComboBox名で置き換えることができます。
したがって、上記の例でComboBox cbColor
にテキストのWhite
あり、ComboBox 'cbType'でドロップダウンを実行すると、上記のコードは次のようになります。
var query = MyContext.Items.Select("Type");
query = query.Where("Color=@0", "White");
「タイプ「文字列」にプロパティまたはフィールド「色」が存在しません」というエラーが表示されます
手順を間違った順序で実行しています。クエリの各部分は、適用された順序で実行されます。最初に文字列のリストに絞り込み、次にwhereフィルターを文字列のリストに適用して、selectを最初ではなく最後に適用します。