Linq запросы на дБ и использование пользовательских сравнения - PullRequest
0 голосов
/ 19 октября 2010

Какая польза от использования пользовательских компараторов в запросах 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 обрабатывает это внутренне, когда отправляет запрос к БД только после того, как все случаи в сравниваются.

Edit:

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

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

Тогда что вы думаете об ожидаемом поведении?

Спасибо.

1 Ответ

1 голос
/ 19 октября 2010

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

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

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

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

...