首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinQ如何使用地理距离从join中仅获得1个结果

LinQ如何使用地理距离从join中仅获得1个结果
EN

Stack Overflow用户
提问于 2014-07-19 04:18:34
回答 2查看 68关注 0票数 0

我必须遵循以下方案:

一家公司可以有多个地址,每个地址都有一个邮政编码。客户按邮政编码搜索,结果应该是半径10英里内的所有公司。A公司的地址可以在许多不同的位置,我只想返回半径在10英里内的1。

我需要一个linq查询来获取公司和他们在10英里半径内的地址。我不想要他们在半径之外的其他地址。

这是我已经拥有的,但它返回所有地址,即使是半径之外的地址:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2014-07-19 07:04:00

试试这个:

代码语言:javascript
复制
var result = context.Adresses.Where(x => context.Company.Id = x.CompanyId && x.Location.Distance(geo) <= distanceMeters).ToList()

**这是未经测试的,但我希望这能给您一些想法;)!

票数 0
EN

Stack Overflow用户

发布于 2014-07-19 19:48:09

对于关系1-many,lookUp是很快的:

代码语言:javascript
复制
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具有属性地址(字符串)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24833137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档