Linq或存储过程 - 我应该选择哪个?

时间:2009-08-29 13:32:18

标签: c# sql-server linq stored-procedures

活动发生在特定日期的某个位置,但每个活动可能会在不同日期的相同或不同位置重复。我已经创建了一个实体框架模型,并希望用两个日期之间发生的相关活动填充它,按照距指定位置的位置距离排序。

因此我有以下表格:

活动(A)

发生(O)

位置(L)

关系如下:

1-n O n-1 L

我在使用linq实体时遇到了一些困难,但我确信我可以在存储过程中实现它。

这是我应该能够使用Linq做的事情,还是Linq创建Sql的问题太复杂了?任何关于编写Linq查询的指针都会受到赞赏,如果它应该能够做到的话。

4 个答案:

答案 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
            };