Как я могу использовать собственные выражения в DevArt LINQ to Entities, а также использовать синтаксис понимания запросов? - PullRequest
1 голос
/ 01 июня 2011

У меня есть ситуация, когда мне нужно использовать пользовательское выражение в запросе LINQ to Entities (потому что я хочу иметь пользовательскую логику, которую L2E иначе не понял бы:

var query = db.MyTable.Where(MyPredicateExpression)

Но яЯ бы предпочел использовать синтаксис понимания запросов:

var query = from x in db.MyTable where [x matches the predicate of MyPredicateExpression]

Я знаю, что это возможно, потому что L2E поддерживает его в других местах:

var query = from x in db.MyTable where x.Length > 10

Как они это делают?

Редактировать : Я использую LinartConnect Devart для Oracle, который может вести себя несколько иначе, чем Microsoft L2E.

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Entity Framework и LINQ to SQL не поддерживают этот сценарий, поскольку перевод MyPredicateExpression должен быть добавлен в транслятор дерева выражений.
Я рекомендую создать хранимую функцию, выполняющую проверку предикатов, и добавить эту функцию в DataContext.В этом случае вы сможете использовать запрос, подобный следующему:

var query = from x in db.MyTable where context.MyPredicateFunction(x.Field) select x;

Обновить. Вот обновленный запрос, который учитывает ваши комментарии:

int[] values = new int[] { 1, 2, 3 };
var query = from x in db.MyTable where values.Contains(x.AuditState) select x;  

Обновление 2. Вы можете добавить свойство Queryable в свой контекст, который будет получать необходимый набор объектов MyTable, как показано в следующем примере:


public partial class MyDataContext {  
  IQueryable<MyTable> GetSpecialTables {  
    get {   
      int[] values = new int[] { 1, 2, 3 };
      return this.MyTables.Where(x => values.Contains(x.AuditState));  
    }  
  }
}

Замените MyDataContext фактическим именем вашего контекста.

0 голосов
/ 01 июня 2011

Если я правильно понимаю проблему, вы можете использовать метод расширения ИЛИ вызвать функцию, которая возвращает bool.

...