Я использую LINQ для запросов данных. Рассмотрите случай, где пользователь только хочет сообщить относительно, говорят что 1 из этих 3 полей? (см. ниже),
Кто-либо может сказать мне, как создать запрос динамично?
Спасибо
DD
var query =
from cl in db.tblClaims
join cs in db.tblCases
on cl.ref_no equals cs.ref_no
where cl.claim_status == "Appeal"
&& cl.appeal_date >= Convert.ToDateTime(txtReferedFromDate.Text)
&& cl.appeal_date <= Convert.ToDateTime(txtReferedToDate.Text)
&& cs.referred_from_lho == dlLHO.Text
&& cs.adviser == dlAdviser.Text
select new
{
Ref = cs.ref_no,
ClaimType = cl.claim_type,
ClaimStatus = cl.claim_status,
AppealDate = cl.appeal_date
};
gvReport.DataSource = query;
Вы можете сделать что-то вроде этого:
var query = from cl in db.tblClaims
join cs in db.tblCases
on cl.ref_no equals cs.ref_no
where cl.claim_status == "Appeal"
select new
{
Ref = cs.ref_no,
ClaimType = cl.claim_type,
ClaimStatus = cl.claim_status,
AppealDate = cl.appeal_date,
cs.referred_from_lho,
cs.adviser
};
if(!string.IsNullOrEmpty(txtReferedFromDate.Text)
&& !string.IsNullOrEmpty(txtReferedToDate.Text))
query = query.Where(cl =>
cl.appeal_date >= Convert.ToDateTime(txtReferedFromDate.Text)
&& cl.appeal_date <= Convert.ToDateTime(txtReferedToDate.Text));
if(!string.IsNullOrEmpty(dlLHO.Text))
query = query.Where(cl => cl.referred_from_lho == dlLHO.Text);
if(!string.IsNullOrEmpty(dlAdviser.Text))
query = query.Where(cl => cl.adviser == dlAdviser.Text);
gvReport.DataSource =
query.Select(o => new { o.Ref, o.ClaimType, o.ClaimStatus, o.AppealDate });
Это будет использовать эти поля в качестве фильтров, только если они имеют значения для фильтрации, иначе они не будут использоваться в запросе.
вот так:
namespace overflow4
{
class Program
{
static void Main(string[] args)
{
var orig = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
var newlist = FilterNumbers(orig, true, false, false);
foreach (int x in newlist)
Console.WriteLine(x);
Console.ReadLine();
}
private static IEnumerable<int> FilterNumbers(
List<int> origlist,
bool wantMultiplesOf2,
bool wantMultiplesOf3,
bool wantMultiplesOf5)
{
IEnumerable<int> sofar = origlist;
if (wantMultiplesOf2)
sofar = sofar.Where(n => n % 2 == 0);
if (wantMultiplesOf3)
sofar = sofar.Where(n => n % 3 == 0);
if (wantMultiplesOf5)
sofar = sofar.Where(n => n % 5 == 0);
return sofar;
}
}
}
Microsoft создала пример библиотеки (Linq Dynamic Library), которая позволяет создавать динамические запросы в Linq, вы можете увидеть, как ее использовать, и загрузить ее из эта ссылка: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library .aspx
При этом вы также можете объявить IQueriable в начале вашего кода и добавить предложения where в зависимости от параметров. Я собирался написать пример, но mattruma меня опередила :)
Я предпочитаю второй вариант, но бывают ситуации, когда использование динамической библиотеки является лучшим решением.
Мы делаем это, передавая объект Criteria, а затем строим запрос, добавляя желаемые критерии с использованием деревьев выражений.
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());
if (criteria.MaximumRecords != null) // MaximumRecords
query = query.Take(criteria.MaximumRecords.Value);
var data = query.Select(row => StoryInfo.FetchStoryInfo(row));
Вы также можете ознакомиться с библиотекой Dynamic Linq по адресу http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the- linq-dynamic-query-library.aspx