У меня есть функция, которую я хотел бы преобразовать в выражение LINQ to SQL, но я не могу понять, как это сделать. Эта функция вызывается из запроса LINQ, один раз для каждой строки в наборе результатов. Передаваемый productAreaId может указывать или не ссылаться на действительные данные, поэтому я должен проверять, а затем фильтровать только по productAreaId, если после применения фильтра есть строки:
//Forgive the contrived example...
public static IQueryable<Order> GetOrders(int orderNumber, int? productAreaId,
OSDataContext db)
{
var orders = db.Orders.Where(o => o.OrderNumber == orderNumber &&
o.Group.GroupTypeId != (int)GroupTypeId.INTERNAL &&
!o.Deleted);
if (productAreaId != null)
{
var orders2 = orders.Where(o => o.ProductAreaId == productAreaId);
if (orders2.Any()) return orders2;
}
return orders;
}
Я не хочу делать это так. Мне нужна функция, которая возвращает выражение без произвольного кода, поэтому оно будет составным. Вышеуказанная функция отображается только потому, что я знаю, как это можно заключить в функцию. Это единственный способ.
Я бы хотел сделать что-то вроде этого, заменив надуманный ApplyFilterIfAnyResultExists чем-то, что действительно работает:
public static Expression<Func<Order,bool>>
GetOrdersExpr(int orderNumber, int? productAreaId)
{
return o => o.OrderNumber == orderNumber &&
o.Group.GroupTypeId != (int)GroupTypeId.INTERNAL &&
!o.Deleted && (productAreaId == null ||
//Making up a fictional function. Is there a real way to do this?
o.ApplyFilterIfAnyResultExists(row =>
row.ProductAreaId == productAreaId)
);
}
Есть ли способ применить этот тип фильтра в выражении LINQ to SQL? Если нет, какие-либо предложения?
Спасибо!
Рой
EDIT:
Это основной запрос, который я хотел бы посмотреть:
var customerData =
from c in db.Customers
select new
{
id = c.Id,
name = c.Name,
lastOrder =
db.Orders
.Where(GetOrdersExpr(c.LastOrderNumber,
c.PreferredProductAreaId))
.FirstOrDefault(),
allOrders = c.OrderForms
.Select(form =>
db.Orders
.Where(GetOrdersExpr(form.OrderNumber,
c.PreferredProductAreaId))
.FirstOrDefault()
)
.Where(o => o != null)
//How lastOrder used to be queried
//lastOrder =
// GetOrders(c.LastOrderNumber, c.PreferredProductAreaId, db)
// .FirstOrDefault()
};
Стоит также отметить, что Заказы и Клиенты находятся в двух разных базах данных на сервере базы данных, но здесь они оба ссылаются на один и тот же DataContext.