我必须遵循以下方案:
一家公司可以有多个地址,每个地址都有一个邮政编码。客户按邮政编码搜索,结果应该是半径10英里内的所有公司。A公司的地址可以在许多不同的位置,我只想返回半径在10英里内的1。
我需要一个linq查询来获取公司和他们在10英里半径内的地址。我不想要他们在半径之外的其他地址。
这是我已经拥有的,但它返回所有地址,即使是半径之外的地址:
var distanceMeters = distanceMiles * 1609.34d; //the distance
DbGeography geo = GetGeoLocationByPostcode(postalCode.Replace(" ", "")); //gets the geo for the query
//Attempt 1
return (from m in context.Company
let ma = context.Addresses.OrderBy(ma2 => m.ID == ma2.CompanyId && ma2.Location.Distance(geo) <= distanceMeters)
orderby ma.Location.Distance(geo)
select m).Take(items).ToList();
//Attempt 2
return (from m in context.Company
join ma in context.Addresses on m.ID equals ma.CompanyId
orderby ma.Location.Distance(geo)
where ma.Location.Distance(geo) <= distanceMeters
select m).Take(items).ToList();
//Attempt 3
return (from m in context.Company
from ma in context.Addresses.Where(o => o.CompanyId == m.ID && o.Location.Distance(geo) <= distanceMeters).ToList().Take(1)
orderby ma.Location.Distance(geo)
select m).Take(items).ToList();所以我来请教专家,因为我是一个老式的SQL存储过程的家伙,当我用EF6学习linq时,我总是遇到一些查询,我可以简单地用TSQL编写,但是这个linq的东西很难让我理解,任何帮助都是非常感谢的。tks
发布于 2014-07-19 07:04:00
试试这个:
var result = context.Adresses.Where(x => context.Company.Id = x.CompanyId && x.Location.Distance(geo) <= distanceMeters).ToList()**这是未经测试的,但我希望这能给您一些想法;)!
发布于 2014-07-19 19:48:09
对于关系1-many,lookUp是很快的:
var context_lookup_byID = context.Adresses.ToLookUp(p=>p.CompanyId);
var query = (from c in context.Company
select new
{
Name = c.CompanyName,
simpleAdress = context_lookup_byID[c.Id].Where(p=>p.Location.Distance(geo) <= distanceMeters).OrderBy(p=>p.Location.Distance(geo)).FirstOrDefault(null)
}).Take(numbers);
foreach(var q in query)
{
Console.Write(q.Name + " ");
bool notFound = q.simpleAdress == null;
if(notFound)
Console.Write("not found any address");
else
Console.Write("Nearest adress: " + q.simpleAdress.Adress);
}我接受数据context.Company具有属性名称(字符串),而context.Adressess具有属性地址(字符串)。
https://stackoverflow.com/questions/24833137
复制相似问题