Entity Framework 5 を使用するように ADO.NET アプリケーションを変換していますが、検索機能を書き直しているときに問題が発生しました。UI レイヤーと DB レイヤーを分離しました。DB レイヤーには内部 edmx があり、データ取得メソッドが公開されています。
そのような方法の 1 つが検索です。関数はフォーム コントロールの値に直接アクセスできなくなったため (以前は、UI コード ビハインド ファイルに LINQ クエリがありました)、フォームがそれらの値を渡せるようにするクラスを作成しました。
public class SearchParameter
{
public string Name { get; set; }
public bool Checked { get; set; }
public object Value { get; set; }
}
これにより値がボックス化されることはわかっていますが、複数の値の型を許可する別の方法は見当たりませんでした
検索機能はこんな感じ
public static IList SearchRecords(IList<SearchParameter> searchParams)
{
using (var db = new EarnieEntities())
{
var result = db.Non_Conformance;
//Filter Results based on params
foreach (var p in searchParams.Where(p => p.Checked))
{
switch (p.Name)
{
case "NCID":
break;
case "DateRaised":
break;
case "RaisedBy":
break;
case "RaisedFor":
break;
}
}
return result.ToList();
}
}
これらのケースのそれぞれで LINQ to SQL を使用すると、このようなものを記述して、そのフィールドで設定された結果をフィルター処理できます。
result = result.Where(x => x.NC_ID == (int) p.Value).Select(x => x);
LINQ to SQL を使用する際のアイデアは、遅延読み込みを利用して、結果にアクセスする前にすべてのフィルター処理を許可することでした。これにより、ユーザーは UI でフィールドを選択し、検索条件を作成できます。
EFを使用すると、
ソース タイプ Linq.IQueryable< Type > をターゲット タイプ Data.Entity.DbSet< Type > に変換することはできません
そのようなフィルタリングを行う別の方法はありますか?
[アップデート]
結果を単純に DbSet にキャストしようとすると、別のエラーが発生します
タイプ 'System.Data.Entity.Infrastructure.DbQuery
1[EarnieDAL.Sources.Non_Conformance]' to type 'System.Data.Entity.DbSet
1 [EarnieDAL.Sources.Non_Conformance]のオブジェクトをキャストできません