Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从元组获取结果的快速查询_C#_Sql Server 2008_Linq To Sql_Gis - Fatal编程技术网

C# 从元组获取结果的快速查询

C# 从元组获取结果的快速查询,c#,sql-server-2008,linq-to-sql,gis,C#,Sql Server 2008,Linq To Sql,Gis,我有一个表格记录了两个有效的英国邮政编码与Google/Bing之间的距离。在使用系统时,会将此表添加到中,以便下一个距离查询变得快速,并且我不必调用web服务在线检索距离 以下是表格结构: OID PostcodeA PostcodeB DistanceMeters DistanceMiles -------------------- --------- --------- ----------

我有一个表格记录了两个有效的英国邮政编码与Google/Bing之间的距离。在使用系统时,会将此表添加到中,以便下一个距离查询变得快速,并且我不必调用web服务在线检索距离

以下是表格结构:

    OID                  PostcodeA PostcodeB DistanceMeters                          DistanceMiles
    -------------------- --------- --------- --------------------------------------- ---------------------------------------
    1                    BR60PS    BT248DN   788847                                  490
    2                    BR60PS    CM201JA   64426                                   40
    3                    BR60PS    CM82AP    77640                                   48
    4                    BR60PS    CO123AX   131617                                  82
    5                    BR60PS    CT146EL   119366                                  74
    6                    BR60PS    DA110TA   29247                                   18
    7                    BR60PS    DE216AH   262570                                  163
    8                    BR60PS    DL81AB    397524                                  247
    9                    BR60PS    HG27JE    368802                                  229
    10                   BR60PS    IP121AL   144394                                  90
    11                   BR60PS    IP141AH   144183                                  90
    12                   BR60PS    IP209AH   172259                                  107
现在我有了一个标量UDF,我通过Linq to SQL使用它,它的定义如下:

ALTER FUNCTION [dbo].[GetDistanceFromCache]
(@PostcodeA VARCHAR (MAX), @PostcodeB VARCHAR (MAX))
RETURNS DECIMAL
AS
BEGIN
    DECLARE @FoundDistance AS DECIMAL;
    SELECT @FoundDistance = DistanceMiles
    FROM   AddressInfoRecordedDistance
    WHERE  (PostcodeA = @PostcodeA
                    AND PostcodeB = @PostcodeB)
                 OR (PostcodeB = @PostcodeA
                         AND PostcodeA = @PostcodeB);
    RETURN ISNULL(@FoundDistance, -1);
END
我需要知道是否有更快的SQL语句或c linq来获得结果?如果我检索800名员工并对50个作业运行他们,系统将进入暂停状态,如果我不将DBContext.GetDistanceFromCache添加到选择集,所花费的时间将大大减少

下面是暂停查询:

        var query =
                    from locum in DbContext.Locums
                    where
                     locum.IsActive == true &&
                     locum.IsAdminMarkedComplete == true &&
                     locum.IsLocumsExciteBan == false &&
                     locum.IsGPHCBan == false &&
                        filterID1.Contains(locum.OID) == false &&
                        filterID2.Contains(locum.OID) == false
                    select new {
                        LocumID = locum.OID,
                        LocumName = locum.FirstName + " " + locum.LastName,
                        locum.MobileNumber,
                        locum.Email,
                        Gender = locum.Gender ? "Male" : "Female",
                        locum.DateofBirth,
                        LocumType = locum.LocumType.Name,
                        **Distance** = DbContext.GetDistanceFromCache(_Postcode, locum.AddressInfo.Postcode),
                        Address = String.Format("{0} {1} {2} {3}",
                                             locum.AddressInfo.House.Length == 0 ? String.Empty : locum.AddressInfo.House + ", ",
                                             locum.AddressInfo.Street.Length == 0 ? String.Empty : locum.AddressInfo.Street + ", ",
                                             locum.AddressInfo.Area.Length == 0 ? String.Empty : locum.AddressInfo.Area + ", ",
                                             locum.AddressInfo.Postcode ?? String.Empty),
                        Postcode = locum.AddressInfo.Postcode,
                        City = locum.AddressInfo.City.Name,
                        County = locum.AddressInfo.City.County.Name,
                        locum.SystemUserID
                    };

我认为您的查询很慢,因为每次LINQ查询选择new{…}时都必须调用DB,这与您有结果行的次数相同

在将结果集与之匹配之前,我将从表AddressInforecordAddInstance下载数据。我是这样想的:

var query = from locum in DbContext.Locums
            where ...
            select new { ... }; // Don't include GetDistanceFromCache here

var airds = from a in DbContext.AddressInfoRecordedDistance
            select a;

foreach (var q in query)
    q.Distance = GetDistanceFromCache(q.PostcodeA, q.PostcodeB, airds);
就在这里。当然,您还需要GetDistanceFromCache方法:


当然,如果您多次运行上述所有操作,您应该缓存变量airds。

如果您对距离查询的脏读取感到满意,您可以添加表提示,如Nolock。有关更多信息,请参阅


另一个选项是确保在AddressInRecordedDatabase表上为PostcodeA和PostcodeB设置了适当的索引,并且变量和字段的数据类型匹配,因此没有隐式数据类型转换。

创建索引是一个非常有价值的建议。让我们看看我是否能在这里获得一些速度。我确实获得了速度。我还通过在PostcoseA和PostcodeB列上添加唯一的约束来确保数据的一致性。
// The SQL UDF in C# code here (psuedo code, not tested, just "C blunt")
decimal GetDistanceFromCache(string PostcodeA, string PostcodeB, List<...> table)
{
    return (from t in table
            where
                (t.PostcodeA == PostcodeA && t.PostcodeB == PostcodeB) ||
                (t.PostcodeB == PostcodeA && t.PostcodeA == PostcodeB)
            select t).FirstOrDefault().DistanceMiles;
}