2009-05-21 11 views
2

は、これは私が、動的LINQのを見ていたし、その上に私の感触を拡大しようとしています私の静的なクエリiは、動的LINQでこれを行うことができますか良い方法はあります - LINQの、C#の、VS2008

var results = from v in users 
       join d in orders on v.UserId equals d.UserId 
       join p in Products on d.ProductId equals p.ProductId 
       where v.UserName.Contains(UserName) 
       where v.FirstName.Equals(FirstName) 
       where v.ZipCity.Equals(ZipCity) 
       where v.OrderDate >= OrderDate && v.OrderDate < OrderDate 
       where p.ProductName.Equals(ProductName) 
       select v.Email, v.ShippingCity, v.TrackingNo; 

です。上記のクエリは

GetOrder(string UserName, string FirstName, string ZipCity, DateTime OrderDate, ProductName) 

と呼ばれる方法で、私は、動的にLINQでこれを行うことができ、商品名は、入力パラメータにnullでない場合にのみ、製品表に参加していますか?

私はこの http://blog.bvsoftware.com/post/2008/02/27/How-to-create-a-Dynamic-LINQ-Query-Programmatically.aspx

答えて

1

を以下ました、私はこの質問のために与えた答えを見てみましょう:

Best Practices for Building a Search App?

+0

Jason、入力パラメータに基づいて異なるテーブルの結合をどのように扱うのですか? – user38230

+0

各テーブルタイプから拡張メソッドを作成できます。その後、それらのテーブルにフィルタを適用することができます。したがって、table1.Filter()からのクエリを取得することができます。table2.Filter() – CodeLikeBeaker

2

私はIEnumerableを代わりの動的LINQの拡張メソッドを使用したいと思います。

var result = from v in users 
      join d in orders on v.UserId equals d.UserId 
      where v.UserName.Contains(UserName) 
      where v.FirstName.Equals(FirstName) 
      where v.ZipCity.Equals(ZipCity) 
      where v.OrderDate >= OrderDate && v.OrderDate < OrderDate 
      select v.Email, v.ShippingCity, v.TrackingNo, d.ProductId; 

if (!string.IsNullOrEmpty(ProductName)) 
{ 
    result = result.Join(Products.Where(p=> p.ProductName == ProductName), 
         d => d.ProductId, 
         p => p.ProductId, 
         (d,p) => new 
            { 
             d.Email, 
             d.ShippingCity, 
             d.TrackingNo 
            }); 
} 
関連する問題