動的ジェネリック メソッドを構築しようとしていました。高度な検索メカニズムを作成するため。
Dynamic LINQ を使用して何かを達成できた
IQueryable<Table> query = ObjectContext.Table;
if (parameters != null && parameters.Count > 0)
{
foreach (KeyValuePair<string, dynamic> keyValuePair in parameters)
{
query = query.Where(keyValuePair.Key + " == @0", new object[] { keyValuePair.Value });
}
}
しかし、これを行うには、各フィールドに次のようなものをロードする必要があります
ClassTable.Parameters.Add("FKTable.Foo", foo);
ClassTable.Parameters.Add("Bar", bar);
だから私は他のアプローチを試しています(このコードは機能します)
List<Table> lstTable = new List<Table>();
lstTable.AddRange(tableDAO.SelectWhere(
u => this.EntityValues.Foo == u.Foo && this.EntityValues.Bar == u.Bar
));
return lstTable;
さて、私の問題は、もっと似たようなことをしたかったことです(このコードは最初のクエリの結果のみをもたらします)
List<Table> lstTable = new List<Table>();
lstTable.AddRange(tableDAO.SelectWhere(
u => !string.IsNullOrEmpty(this.EntityValues.Foo) ? this.EntityValues.Foo == u.Foo : false
&&
this.EntityValues.Bar != 0 ? this.EntityValues.Bar == u.Bar : false
));
return lstTable;
こんなことしたくなかった
IQueryable<Data.Story> query = ctx.DataContext.Stories;
if (criteria.StoryId != null) // StoryId
query = query.Where(row => row.StoryId == criteria.StoryId);
if (criteria.CustomerId != null) // CustomerId
query = query.Where(row => row.Project.CustomerId == criteria.CustomerId);
if (criteria.SortBy != null) // SortBy
query = query.OrderBy(criteria.SortBy + " " + criteria.SortOrder.Value.ToStringForSql());
私の質問がちょっとごちゃごちゃしていることはわかっています。修正するために編集とコメントを提供します。私に知らせて。
TL;DR; 検索で使用されるパラメーターのみを渡す必要がある動的クエリを作成するには、助けが必要です。そのため、ユーザー向けの高度な検索オプションを作成できます。