2010-10-19 1 views
0

Использование пользовательских сопоставлений в запросах Linq? Являются ли они полезными или это просто перегрузка на сервере.Запросы Linq на дБ и использование пользовательских сопоставлений

Так я говорю о запросах, как

IEnumerable<Class> GetMatch(Class comparerObject) 
{ 
    return Session.Linq<Class>().Where(x=>new StringComparer<Class>().Equals(x,comparerObject)) 
} 

и это, как мой класс StringComparer выглядит

public class StringComparer<T> : IEqualityComparer<T> 
    where T : class, IStringIdentifiable 
{ 
    public bool Equals(T x, T y) 
    { 
     if (x == null && y == null) 
      return true; 

     if (x == null || y == null) 
      return false; 

     return x.Id.Equals(y.Id, StringComparison.OrdinalIgnoreCase); 
    } 

Так мне было интересно, как это запрос запустить с БД? Я думаю, что linq обрабатывает это внутренне, где в нем отправляется запрос в db только после запуска всех случаев сравнения.

Edit:

Ну, если вы обнаружили, что трудно поверить, что не будет работать, а затем взять простой пример, как

return Session.Linq<Class>().Where(x=>x.Id.Equals(comparerObject,StringComparison.InvariantCultureIgnoreCase)) 

Тогда как вы думаете, это ожидаемое поведение?

Спасибо.

ответ

1

Для LINQ to SQL я ожидал, что сбой во время выполнения - переводчик запросов не будет знать, что делать с вашим классом StringComparer<T>.

В случае, если вы дали, вы должны просто использовать:

string idToMatch = comparerObject.Id; 
return Session.Linq<Class>().Where(x => x.Id == idToMatch); 

Более сложные случаи могут или не могут быть выполнимы в зависимости от точно то, что вы хотите достичь.

+0

У меня создалось впечатление, что если Linq не знает, как перевести данный кусок кода в SQL, он просто вытащит все данные без этого условия и применит его к коллекции in-memory вместо отказа при выполнении время? Или я думаю о чем-то несвязанном? – R0MANARMY

+0

@ R0MANARMY: вы можете сделать это, если хотите, выбрав AsEnumerable, но по умолчанию это не будет сделано. –

+0

Благодарим вас за разъяснение, что вам придется помнить, что IQueryable не любит вещи, которые он не может перевести. – R0MANARMY