Now i've found there's a much better way. Although this looks a lot like a hack, the result is so amazing that i encourage it to be used as a standard.
Apparently this guy just dug deep into the linq 2 sql code, and what he ended up with was this:
private static bool IsCompareMethod(SqlMethodCall call) { return (((call.Method.IsStatic && (call.Method.Name == "Compare"))&& (call.Arguments.Count > 1)) && (call.Method.ReturnType == typeof(int))); }So basically if we provide a static method named 'Compare' which has two parameters and returns an int, then it is a comparison method. This means it will be transformed into a comparison expression inside SQL. Using this information, he suggests just creating an extension method to the Binary (in my case, byte[] data, but it's basically the same thing) method, with the proper signature.
public static class ComparatorBinar { public static int Compare(this byte[] b1, byte[] b2) { throw new NotImplementedException(); } }We don't need to throw an exception here, but it's just to suggest that this method isn't actually going to be called from inside .net, but it will be mapped to a comparison method in SQL.
We can now use this in any linq query to compare binary data:
var data = GetSomeBinaryData(); var elem = (from e in dataContext.Elements where e.BinaryData.Compare(data) == 0 select e).FirstOrDefault();Voila! This of course will be translated into T-SQL, which knows by default to compare binary data.
I'm not sure why there isn't a default implementation for comparing binary data btw.
Original source: Linq 2 SQL, Expression Trees and Binary Comparing
No comments:
Post a Comment