У меня есть метод BuildQuery
, который динамически генерирует запрос. Хорошо работает для SQL:
static MyType[] GetDataFromDB(MyDataContext db, string city, string district, string region, string country, string zip)
{
var q = BuildQuery(db.MyTable.AsQueryable(), city, district, region, country, zip);
return q.ToArray();
}
private static IQueryable<MyType> BuildQuery(IQueryable<MyType> q, string city, string district, string region, string country, string zip)
{
if (!string.IsNullOrEmpty(city))
q = q.Where(p => p.City.Contains(city));
if (!string.IsNullOrEmpty(district))
q = q.Where(p => p.District.Contains(district));
if (!string.IsNullOrEmpty(zip))
q = q.Where(p => p.Zip == zip);
if (!string.IsNullOrEmpty(region))
q = q.Where(p => p.Region.Contains(region));
if (!string.IsNullOrEmpty(country))
q = q.Where(p => p.Country == country);
return q;
}
(На самом деле этот запрос немного сложнее.) Это хорошо работает при построении SQL-запроса с некоторыми значениями LIKE
.
Теперь я хотел бы использовать тот же запрос для массива MyType
:
MyType[] SelectFromResult(MyType[] loc, string city, string district, string region, string country, string zip)
{
var q = BuildQuery(loc, city, district, region, country, zip);
return q.ToArray();
}
Грубо говоря, это не компилируется, потому что MyType[]
это IEnumerable<MyType>
, а не IQueryable<MyType>
. Изменение типа первого аргумента в BuildQuery
на IEnumerable<MyType>
компилирует и работает для массивов, но не создает запрос SQL.
Полагаю, я мог бы сделать BuildQuery универсальным методом, но как? Есть идеи?