2009-05-21 3 views
2

Это мой статический запросМогу ли я сделать это с помощью динамического 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; 

Я смотрел на динамичном Linq и пытаюсь расширить мое чувство на нем. Выше запрос в методе, называемом

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

Могу ли я сделать это с помощью Dynamic Linq, присоединиться к продуктам таблицы, только если ProductName не равно нулю в параметре ввода?

я после этого 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

Вы можете создать метод расширения для каждого типа таблицы. Затем вы можете применить фильтры к этим таблицам. Таким образом, вы можете получить запрос из таблицы1.Filter() join table2.Filter() – CodeLikeBeaker

2

Я думаю, что я хотел бы использовать методы расширения на IEnumerable вместо Dynamic 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 
            }); 
}