Linq查询数据库并使用自定义比较器

Linq查询数据库并使用自定义比较器,linq,nhibernate,linq-to-sql,linq-to-nhibernate,Linq,Nhibernate,Linq To Sql,Linq To Nhibernate,在Linq查询中使用自定义比较器有什么用?它们是有益的还是只是服务器上的一个过载 所以我说的是这样的问题 IEnumerable<Class> GetMatch(Class comparerObject) { return Session.Linq<Class>().Where(x=>new StringComparer<Class>().Equals(x,comparerObject)) } IEnumerable GetMatch(类比较对象

在Linq查询中使用自定义比较器有什么用?它们是有益的还是只是服务器上的一个过载

所以我说的是这样的问题

IEnumerable<Class> GetMatch(Class comparerObject)
{
  return  Session.Linq<Class>().Where(x=>new StringComparer<Class>().Equals(x,comparerObject))
}
IEnumerable GetMatch(类比较对象)
{
返回Session.Linq()。其中(x=>newStringComparer()。等于(x,CompareObject))
}
这就是我的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);
    }
公共类StringComparer:IEqualityComparer
其中T:class,IstringIdentified
{
公共布尔等于(TX,TY)
{
如果(x==null&&y==null)
返回true;
如果(x==null | | y==null)
返回false;
返回x.Id.Equals(y.Id,StringComparison.OrdinalIgnoreCase);
}
所以我想知道这个查询是如何针对db运行的?我认为linq会在内部处理这个问题,在这种情况下,它只在comparere中的所有案例都运行之后才向db发送请求

编辑:

如果你觉得很难相信上述方法不起作用,那么举一个简单的例子,比如

return  Session.Linq<Class>().Where(x=>x.Id.Equals(comparerObject,StringComparison.InvariantCultureIgnoreCase))
return Session.Linq().Where(x=>x.Id.Equals(compareObject,stringcomparation.InvariantCultureIgnoreCase))
那么你认为预期的行为是什么


谢谢。

对于LINQ to SQL,我预计在执行时会失败-查询转换器将不知道如何处理您的
StringComparer

在您给出的情况下,您应该只使用:

string idToMatch = comparerObject.Id;
return Session.Linq<Class>().Where(x => x.Id == idToMatch);
string-idToMatch=compareObject.Id;
返回Session.Linq(),其中(x=>x.Id==idToMatch);

更复杂的情况可能可行,也可能不可行,具体取决于您想要实现的目标。

我的印象是,如果Linq不知道如何将给定的代码段转换为SQL,它只会在没有该条件的情况下提取所有数据,并将其应用于内存集合,而不会在执行时失败?或者我认为你可以通过调用AsEnumerable让它这么做,但默认情况下它不会这么做。谢谢你澄清这一点,你必须记住IQueryable不喜欢它不能翻译的东西。