21

Linq を使用して動的にフィルターを作成するパターンはありますか?

リストにカスタム フィルタリングを作成する必要があります。以前は動的に SQL を作成していましたが、Linq ではこれが可能ではないようです。

4

4 に答える 4

19

ScottGu のブログからダイナミック Linq ライブラリをチェックしてください。

たとえば、以下は、Northwind データベースからデータを取得し、ASP.NET GridView コントロールに表示する、標準のタイプ セーフな LINQ to SQL VB クエリです。

Dim Northwind As New NorthwindDataContext
Dim query = From q In Northwind.Products Where p.CategoryID = 2 And p.UnitPrice > 3 Order By p.SupplierID Select p

Gridview1.DataSource = query
GridView1.DataBind()

LINQ DynamicQuery ライブラリを使用すると、上記のクエリ式を次のように書き直すことができます。

Dim Northwind As New NorthwindDataContext
Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId")
Gridview1.DataSource = query
GridView1.DataBind()

conditional-where 句と sort-orderby 句が、コード式ではなく文字列式を使用するようになったことに注目してください。これらは遅延バインド文字列であるため、動的に構築できます。たとえば、アプリケーションを使用して、エンドユーザーのビジネス アナリストに UI を提供し、エンド ユーザーが独自にクエリを作成できるようにすることができます (任意の条件句を含む)。

于 2008-08-27T18:57:46.367 に答える
11

Dynamic Linq はその 1 つの方法です。

あなたのシナリオではやり過ぎかもしれません。検討:

IQueryable<Customer> query = db.Customers;

if (searchingByName)
{
  query = query.Where(c => c.Name.StartsWith(someletters));
}
if (searchingById)
{
  query = query.Where(c => c.Id == Id);
}
if (searchingByDonuts)
{
  query = query.Where(c => c.Donuts.Any(d => !d.IsEaten));
}
query = query.OrderBy(c => c.Name);
List<Customer> = query.Take(10).ToList();
于 2008-10-27T20:35:06.773 に答える
5

式の述語を動的に構成する

于 2008-08-27T19:13:00.230 に答える
2

このようなもの?

var myList = new List<string> { "a","b","c" };
var items = from item in db.Items
            where myList.Contains(item.Name)
            select item;

次のようなSQLステートメントを作成します

SELECT * FROM Items [t0] where Name IN ('a','b','c')
于 2008-08-27T18:58:48.780 に答える