私は次のコードを持っていました
query = query.Where(device => GetDeviceDistanceFromGeocode(geocode, device) <= distanceMetres);
private static double GetDeviceDistanceFromGeocode(Geocode geocode, Device device)
{
return Math.Pow(
Math.Pow(device.Address.Geocode.Easting - geocode.Easting, 2) +
Math.Pow(device.Address.Geocode.Northing - geocode.Northing, 2)
, 0.5);
}
ただし、linqが関数を認識できないため、例外がスローされ、クエリ式全体を一度に実行する必要があります。
Exception[LINQ to Entities does not recognize the method
'Double DistanceOfDeviceFromGeocode(Geocode, Device)' method,
and this method cannot be translated into a store expression.]
ここでやろうとしているように、クエリ式を複数の部分に分割することは可能ですか?クエリが非常に大きい場合は、あまり読みやすくありません。
編集:
コメントで求められている完全なクエリは次のとおりです。
return query.Where(device =>
Math.Pow(
Math.Pow(device.Address.Geocode.Easting - geocode.Easting, 2) +
Math.Pow(device.Address.Geocode.Northing - geocode.Northing, 2)
, 0.5)
<= distanceMetres);
基本的に、これはあまり読みやすいとは思わないので、複数の部分に分割したいと思いますが、提供されたリンクからは不可能と思われます。
C ++では、その一部をマクロに分割することもできましたが、残念ながら、これはc#の機能ではありません。
提案に従って、コードをこれに更新しました。これは非常にうまく機能し、コードの可読性を大幅に向上させます。
return query.Where( DevicesWithinDistanceFromGeocode(distanceMetres, geocode) );
}
public Expression<Func<Device, bool>> DevicesWithinDistanceFromGeocode(double distance, Geocode geocode)
{
return device => ( SqlFunctions.SquareRoot(
SqlFunctions.Square((double)(device.Address.Geocode.Easting - geocode.Easting)) +
SqlFunctions.Square((double)(device.Address.Geocode.Northing - geocode.Northing))
) <= distance );
}