У меня есть эти два класса: EFLinq для юридических лиц: открытие матчей
class Row
{
public long CategoryId { get; set; }
public virtual Category Category { get; set; }
public long VesselId { get; set; }
public virtual Vessel Vessel { get; set; }
public int TruckType { get; set; }
}
class RowFilter
{
public long? CategoryId { get; set; }
public virtual Category Category { get; set; }
public long? VesselId { get; set; }
public virtual Vessel Vessel { get; set; }
public int? TruckType { get; set; }
public long? PortId { get; set; }
public virtual Port Port { get; set; }
public bool IsMatch(Row row)
{
if (CategoryId == null || CategoryId == row.CategoryId) {
if (VesselId == null || VesselId == row.VesselId) {
if (TruckType == null || TruckType == row.TruckType) {
if (PortId == null || PortId == row.Vessel.PortId) {
return true;
}
}
}
}
return false;
}
}
То есть:
Filter
соответствует Row
если таковому IsMatch()
возвращает истинную для этой строки.
У меня есть список строк, в IQueryable
образом:
var rows = dbContext.Rows.AsQueryable().Where(...);
... и для каждой строки, я хочу, чтобы выбрать (проект) самой строки и список фильтров, которые соответствуют эта строка. Я могу сделать это легко в пути Linq-на-объекты ("память"):
// Linq-to-objects
rows.ToList().Select(r => new
{
row = r,
filters = dbContext.RowsFilters.Where(f => f.IsMatch(r))
};
Вопрос ... это возможно сделать с Linq-to-Entities? (SQL, а не «в памяти»)
В статичном мире, я бы эти свойства навигации:
class Row
{
...
public virtual List<RowFilter> RowFilters { get; set; }
}
class RowFilter
{
...
public virtual List<Rows> Rows { get; set; }
}
... но это означает, что много обновления: при создании нового RowFilter, при создании новой строки и т.д.
Является 'Row.CategoryId' поле или собственность? В вашем коде это похоже на поле. –
собственность, извините ... отредактирует – sports
Некоторые свойства 'RowFilter' не имеют имени. Я думаю, вы пропустили их. –