C# LINQ to实体无法识别该方法,并且无法将该方法转换为存储表达式
这是我写的LINQtoEntities语句C# LINQ to实体无法识别该方法,并且无法将该方法转换为存储表达式,c#,linq,entity-framework,C#,Linq,Entity Framework,这是我写的LINQtoEntities语句 public static List<Model.User> GetNearestUsers(int userid,int count,ref Model.HangoutDBEntities context) { Model.Location myLocation=GetCurrentLocation(userid,ref context); return context.Locations.Whe
public static List<Model.User> GetNearestUsers(int userid,int count,ref Model.HangoutDBEntities context)
{
Model.Location myLocation=GetCurrentLocation(userid,ref context);
return context.Locations.Where(o => EntityFunctions.DiffMinutes(DateTime.Now, o.DateTimeStamp) <= 30).OrderBy(o => Core.Location.Distance.CalculateDistance(myLocation.Latitude, myLocation.Longitude, o.Latitude, o.Longitude)).Select(o => o.User).ToList();
}
请让我知道是否有任何解决办法。我有个例外
LINQ to实体无法识别方法“Double”
计算状态(System.Decimal,System.Decimal,System.Decimal,
方法,而此方法无法转换为
存储表达式
我知道自定义函数不适用于Linq 2实体,但我不知道如何解决这个问题。你能帮帮我吗 将数据加载到列表中,然后对列表执行计算
var origList = context.Locations.Where(o => EntityFunctions.DiffMinutes(DateTime.Now, o.DateTimeStamp) <= 30).ToList()
var orderedList = origList.OrderBy(o => Core.Location.Distance.CalculateDistance(myLocation.Latitude, myLocation.Longitude, o.Latitude, o.Longitude)).Select(o => o.User).ToList();
var origList=context.Locations.Where(o=>EntityFunctions.DiffMinutes(DateTime.Now,o.DateTimeStamp)Core.Location.Distance.calculateInstance(myLocation.Latitude,myLocation.Longitude,o.Latitude,o.Longitude),选择(o=>o.User.ToList();
或
context.Locations
.Where(o=>EntityFunctions.DiffMinutes(DateTime.Now,o.DateTimeStamp)Core.Location.Distance.calculateInstance(myLocation.Latitude,myLocation.Longitude,o.Latitude,o.Longitude))
.Select(o=>o.User).ToList();
需要注意的是where子句后面的ToList
在调用ToList()时,数据被加载到内存中,排序成为Linq对对象的一项任务
您可以定义一个自定义方法…,并告诉实体框架如何将该方法转换为SQL
我最近不得不解决这个问题。诀窍是对大多数语句(Math.Pow除外)使用System.Data.Entity.SqlServer中的SqlFunctions,而不是System.Math 备用LINQ样式(from/where/let/orderby等)非常有用,因为let关键字允许您分解问题并保持可读性
var closestLocation = await (
from q in qryable
where q.LAT.HasValue && q.LONG.HasValue
// Convert derees to radians (pi / 180 = 0.01745...)
let dbLatitudeRadians = q.LAT.Value * 0.0174532925199433
let dbLongitudeRadians = q.LONG.Value * 0.0174532925199433
let requestLatitudeRadians = requestLatitude * 0.0174532925199433
let requestLongitudeRadians = requestLongitude * 0.0174532925199433
let deltaLatitudeRadians = requestLatitudeRadians - dbLatitudeRadians
let deltaLongitudeRadians = requestLongitudeRadians - dbLongitudeRadians
let sinHalfLatitudeDistance = SqlFunctions.Sin(deltaLatitudeRadians / 2) ?? 0.0
let sinHalfLongitudeDistance = SqlFunctions.Sin(deltaLongitudeRadians / 2) ?? 0.0
let cosThisLatitude = SqlFunctions.Cos(dbLatitudeRadians) ?? 0.0
let cosThatLatitude = SqlFunctions.Cos(requestLatitudeRadians) ?? 0.0
let expr = Math.Pow(sinHalfLatitudeDistance, 2) + cosThisLatitude * cosThatLatitude * Math.Pow(sinHalfLongitudeDistance, 2)
let sqrtExpr = Math.Pow(expr, 0.5)
let sqrt1MinusExpr = Math.Pow(1 - expr, 0.5)
let distanceInMeters = 6376500 * 2 * SqlFunctions.Atan2(sqrtExpr, sqrt1MinusExpr)
orderby distanceInMeters
select q
).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
如果您使用的是sql server,我强烈建议您使用空间数据类型,而不是在内存中进行计算。问题是您的计算无法转换为SQL。
context.Locations
.Where(o => EntityFunctions.DiffMinutes(DateTime.Now, o.DateTimeStamp) <= 30).ToList()
.OrderBy(o => Core.Location.Distance.CalculateDistance(myLocation.Latitude, myLocation.Longitude, o.Latitude, o.Longitude))
.Select(o => o.User).ToList();
var closestLocation = await (
from q in qryable
where q.LAT.HasValue && q.LONG.HasValue
// Convert derees to radians (pi / 180 = 0.01745...)
let dbLatitudeRadians = q.LAT.Value * 0.0174532925199433
let dbLongitudeRadians = q.LONG.Value * 0.0174532925199433
let requestLatitudeRadians = requestLatitude * 0.0174532925199433
let requestLongitudeRadians = requestLongitude * 0.0174532925199433
let deltaLatitudeRadians = requestLatitudeRadians - dbLatitudeRadians
let deltaLongitudeRadians = requestLongitudeRadians - dbLongitudeRadians
let sinHalfLatitudeDistance = SqlFunctions.Sin(deltaLatitudeRadians / 2) ?? 0.0
let sinHalfLongitudeDistance = SqlFunctions.Sin(deltaLongitudeRadians / 2) ?? 0.0
let cosThisLatitude = SqlFunctions.Cos(dbLatitudeRadians) ?? 0.0
let cosThatLatitude = SqlFunctions.Cos(requestLatitudeRadians) ?? 0.0
let expr = Math.Pow(sinHalfLatitudeDistance, 2) + cosThisLatitude * cosThatLatitude * Math.Pow(sinHalfLongitudeDistance, 2)
let sqrtExpr = Math.Pow(expr, 0.5)
let sqrt1MinusExpr = Math.Pow(1 - expr, 0.5)
let distanceInMeters = 6376500 * 2 * SqlFunctions.Atan2(sqrtExpr, sqrt1MinusExpr)
orderby distanceInMeters
select q
).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);