活动发生在特定日期的某个位置,但每个活动可能会在不同日期的相同或不同位置重复。我已经创建了一个实体框架模型,并希望用两个日期之间发生的相关活动填充它,按照距指定位置的位置距离排序。
因此我有以下表格:
活动(A)
发生(O)
位置(L)
关系如下:
1-n O n-1 L
我在使用linq实体时遇到了一些困难,但我确信我可以在存储过程中实现它。
这是我应该能够使用Linq做的事情,还是Linq创建Sql的问题太复杂了?任何关于编写Linq查询的指针都会受到赞赏,如果它应该能够做到的话。
答案 0 :(得分:2)
我不明白为什么那是不可能做到的,甚至是特别困难的。那是个问题吗? :)
根据我的理解,活动表对您的查询并不感兴趣,首先要查找出现次数。您可以在输出中包含Activity
数据,如下所示:
dc.Occurrence.Include("Activity").Where(
o => o.Date >= startDate && o.Date <= endDate
&& o.Location.DistanceFrom(someLocation) < maxDistance)
然而, DistanceFrom
可以确定距离某个位置的距离。我对您的数据库设计没有任何了解。
如果您使用的是SQL Server 2008地理编码,我认为还不支持。 This article(和this continuation)可能会引起关注。它是关于LINQ to SQL的,但表达式构建可能会有所帮助。
答案 1 :(得分:1)
我没有使用Linq,也许我完全错了,但即使你使用Linq也无法使用存储过程?使用存储过程的主要原因之一是从业务层隐藏底层数据模型。通过隐藏数据模型,您可以优化数据访问。这些过程用作应用程序和报告的接口,如果需要修改数据模型,可以在不破坏界面的情况下完成。
从DBA的角度来看,这是我的观点。正如我所说,我不知道Linq的puprose是什么。
答案 2 :(得分:0)
在Linq2Sql中,设计人员会自动在L2S类中创建关系(但不会在设计器中显示它们)
在Linq2Entities中,设计人员将显示外键关系,但不会自动创建它们 - 必须手动完成。 (该声明基于Linq2Entities的测试版 - 它可能不再是真的)。
答案 3 :(得分:0)
var query = from occurrence in occurrenceList join activity in activityList on occurrence.ActivityID equals activity.ID join location in locationList on occurrence.LocationID equals location.ID let distance = CLocation.Distance (referenceLocation, location) orderby distance, activity.Name where start <= occurrence.Date && occurrence.Date <= end select new { ActivityName = activity.Name, LocationName = location.Name, Distance = distance, Date = occurrence.Date };