小编Jef*_*ata的帖子

为什么要使用SQL Server 2008地理数据类型?

我正在重新设计一个客户数据库,我想要存储的一条新信息以及标准地址字段(街道,城市等)是地址的地理位置.我想到的唯一用例是允许用户在无法找到地址时映射Google地图上的坐标,这通常发生在该地区是新开发的,或者位于偏远/乡村地区.

我的第一个倾向是将纬度和经度存储为十进制值,但后来我记得SQL Server 2008 R2有一个geography数据类型.我绝对没有使用过的经验geography,从我最初的研究来看,它看起来对我的场景来说太过分了.

例如,要使用存储为的纬度和经度decimal(7,4),我可以这样做:

insert into Geotest(Latitude, Longitude) values (47.6475, -122.1393)
select Latitude, Longitude from Geotest
Run Code Online (Sandbox Code Playgroud)

但是geography,我会这样做:

insert into Geotest(Geolocation) values (geography::Point(47.6475, -122.1393, 4326))
select Geolocation.Lat, Geolocation.Long from Geotest
Run Code Online (Sandbox Code Playgroud)

虽然它不是那么复杂,但如果我不需要增加复杂性呢?

在我放弃使用的想法之前geography,有什么我应该考虑的吗?使用空间索引搜索位置与使用纬度和经度字段编制索引会更快吗?使用geography我有什么优势我不知道?或者,另一方面,我应该知道哪些会阻止我使用geography


更新

@Erik Philips提出了进行近距离搜索的能力geography,非常酷.

另一方面,快速测试显示,使用select时获得经纬度的简单程度明显较慢geography(详情如下).并且对另一个SO问题的接受答案的评论geography让我很谨慎:

@SaphuA欢迎你.作为旁注,请非常小心在可空的GEOGRAPHY数据类型列上使用空间索引.存在一些严重的性能问题,因此即使您必须重新构建模式,也要使GEOGRAPHY列不可为空. - 托马斯6月18日11:18

总而言之,权衡接近搜索的可能性与性能和复杂性之间的权衡,我决定放弃geography在这种情况下的使用.


我跑的测试细节:

我创建了两个表,一个使用geography,另一个使用decimal(9,6)纬度和经度:

CREATE TABLE [dbo].[GeographyTest]
(
    [RowId] …
Run Code Online (Sandbox Code Playgroud)

geocoding geolocation sql-server-2008

104
推荐指数
2
解决办法
7万
查看次数

对UPDLOCK,HOLDLOCK感到困惑

在研究Table Hints的使用时,我遇到了这两个问题:

这两个问题的答案都说,在使用时(UPDLOCK, HOLDLOCK),其他进程将无法读取该表上的数据,但我没有看到这一点.为了测试,我创建了一个表并启动了两个SSMS窗口.从第一个窗口,我运行了一个使用各种表提示从表中选择的事务.当事务正在运行时,我从第二个窗口运行了各种语句,看看哪些会被阻止.

测试表:

CREATE TABLE [dbo].[Test](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [nvarchar](50) NULL,
 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

从SSMS窗口1:

BEGIN TRANSACTION

SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'

COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

从SSMS窗口2(运行以下之一):

SELECT * FROM dbo.Test
INSERT dbo.Test(Value) VALUES ('bar')
UPDATE dbo.Test SET Value = …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server concurrency locking sql-server-2008

85
推荐指数
2
解决办法
10万
查看次数

比较2 Dictionary <string,string> Instances

我想比较两个Dictionary<string, string>实例的内容,无论它们包含的项目的顺序如何. SequenceEquals还比较了顺序,所以我首先按键排序字典,然后调用SequenceEquals.

有没有我可以使用的方法而不是SequenceEquals只比较内容?

如果没有,这是理想的方法吗?

Dictionary<string, string> source = new Dictionary<string, string>();
Dictionary<string, string> target = new Dictionary<string, string>();

source["foo"] = "bar";
source["baz"] = "zed";
source["blah"] = null;

target["baz"] = "zed";
target["blah"] = null;
target["foo"] = "bar";

// sequenceEquals will be false
var sequenceEqual = source.SequenceEqual(target);
// contentsEqual will be true
var contentsEqual = source.OrderBy(x => x.Key).SequenceEqual(target.OrderBy(x => x.Key));
Run Code Online (Sandbox Code Playgroud)

c# linq comparison dictionary

37
推荐指数
2
解决办法
4万
查看次数

Automapper将数组属性设置为零长度数组而不是null

我正在使用Automapper将值从一个实例复制到另一个实例,我发现如果该类具有数组属性,并且源实例的属性设置为null,则Automapper将目标属性设置为零长度数组的null如我所料.

有没有办法配置Automapper将目标设置null为源何时null

如果我的解释不清楚,以下代码说明了我想要描述的内容:

public class Test
{
    public byte[] ByteArray { get; set; }
    public int? NullableInt { get; set; }
    public int Int { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Mapper.CreateMap<Test, Test>();

        var test1 = new Test { Int = 123, NullableInt = null, ByteArray = null };
        var test2 = Mapper.Map<Test>(test1);

        // test1:  Int == 123, NullableInt == null, ByteArray == null
        // test2: …
Run Code Online (Sandbox Code Playgroud)

automapper

26
推荐指数
1
解决办法
4967
查看次数

使用SSDT,当我有一个引用不同数据库中的对象的视图时,如何解决SQL71561错误?

我在SSDT中有一个数据库项目,当我导入一个引用不同数据库中的对象的视图时,我得到错误SQL71561,其中的描述如下:

错误4 SQL71561:视图:[schema].[viewname]有一个未解析的对象[other_db]的引用.[schema].[table].[column]

我花了一些时间试图解决这个问题,所以为了帮助其他人遇到这个,我会发布对我有用的答案.

sql-server sql-server-data-tools

25
推荐指数
2
解决办法
2万
查看次数

LINQ to Entities group-by failure使用.date

我想在日期时间字段的日期部分做一个Linq组.

这个linq语句可以工作,但它按日期和时间分组.

var myQuery = from p in dbContext.Trends
          group p by p.UpdateDateTime into g
          select new { k = g.Key, ud = g.Max(p => p.Amount) };
Run Code Online (Sandbox Code Playgroud)

当我运行此语句仅按日期分组时,我得到以下错误

var myQuery = from p in dbContext.Trends
          group p by p.UpdateDateTime.Date into g   //Added .Date on this line
          select new { k = g.Key, ud = g.Max(p => p.Amount) };
Run Code Online (Sandbox Code Playgroud)

LINQ to Entities不支持指定的类型成员"Date".仅支持初始值设定项,实体成员和实体导航属性.

我如何按日期而不是日期和时间进行分组?

c# linq linq-to-entities group-by entity-framework-4

17
推荐指数
2
解决办法
7658
查看次数

如何创建一个动态确定的属性名称的匿名对象?

给定一个值数组,我想创建一个具有基于这些值的属性的匿名对象.属性名称只是数组中值的索引"pN"所在N.

例如,给定

object[] values = { 123, "foo" };

我想创建一个匿名对象

new { p0 = 123, p1 = "foo" };

我能想到的唯一方法就是使用一个switchif链到一个合理数量的参数来支持,但我想知道是否有更优雅的方法来做到这一点:

object[] parameterValues = new object[] { 123, "foo" };
dynamic values = null;

switch (parameterValues.Length)
{
    case 1:
        values = new { p0 = parameterValues[0] };
        break;
    case 2:
        values = new { p0 = parameterValues[0], p1 = parameterValues[1] };      
        break;
    // etc. up to a reasonable # of parameters
}
Run Code Online (Sandbox Code Playgroud)

背景 …

c# anonymous-types dapper

16
推荐指数
2
解决办法
2万
查看次数

C# - 通过特殊方式为照片添加水印

我需要通过特殊方式为照片添加水印.我知道怎么做,但我不知道如何做到这一点与文章http://www.photoshopessentials.com/photo-effects/copyright/相同

这是添加水印的方法.如何更改它以获得带有水印的图像,例如上面的文章?

public static Bitmap AddWatermark(this Bitmap originalImage, Bitmap watermarkImage, WatermarkLocationEnum location)
{
    int offsetWidth;
    int offsetHeight;
    if ((watermarkImage.Width > originalImage.Width) | (watermarkImage.Height > originalImage.Height))
        throw new Exception("The watermark must be smaller than the original image.");
    Bitmap backgroundImage = new Bitmap((Bitmap)originalImage.Clone());
    Bitmap image = new Bitmap(backgroundImage.Width, backgroundImage.Height);
    Graphics graphics = Graphics.FromImage(image);
    offsetWidth = GetOffsetWidth(image.Width, watermarkImage.Width, location);
    offsetHeight = GetOffsetHeight(image.Height, watermarkImage.Height, location);
    watermarkImage.SetResolution(backgroundImage.HorizontalResolution, backgroundImage.VerticalResolution);
    offsetWidth = Math.Max(offsetWidth - 1, 0);
    offsetHeight = Math.Max(offsetHeight - 1, 0);
    graphics.DrawImage(watermarkImage, offsetWidth, offsetHeight); …
Run Code Online (Sandbox Code Playgroud)

algorithm image-processing winforms c#-4.0

13
推荐指数
1
解决办法
5490
查看次数

如何将多个表达式传递给OrderBy for EF?

我使用的是EF 4.2,但我希望这也适用于EF 4和4.1.

我想通过一个IQueryable<T>和多个Expression<Func<TSource, TKey>>的方法和具有应用该方法OrderBy,并ThenByIQueryable<T>适当的.

我找到了这个答案,并根据以下内容编写了以下方法:

public IQueryable<User> ApplyOrderBy(IQueryable<User> query, IEnumerable<Expression<Func<User, IComparable>>> orderBy)
{
    if (orderBy == null) 
    {
        return query;
    }

    IOrderedQueryable<User> output = null;

    foreach(var expression in orderBy)
    {
        if (output == null)
        {
            output = query.OrderBy(expression);
        }
        else
        {
            output = output.ThenBy(expression);
        }
    }

    return output ?? query;
}
Run Code Online (Sandbox Code Playgroud)

只要我订购的属性是strings,这样就可以正常工作,但是当我尝试按int属性排序时,我得到一个例外:

无法将类型'System.Int32'强制转换为'System.IComparable'类型.LINQ to Entities仅支持转换实体数据模型基元类型.

有任何建议可以解决这个问题,或者采取不同的方法吗?我考虑过传入IEnumerable<Expression>,但后来需要弄清楚如何回转到特定类型(例如Expression<Func<User, int>)来调用OrderBy.

c# linq linq-to-entities entity-framework-4 entity-framework-4.1

13
推荐指数
1
解决办法
5044
查看次数

生成HierarchyID

我想像这样插入hierarchyId

/ - CEO(根)

/ 1/ - 采购经理/ 2/ - 销售经理

/ 1/1/ - 采购主管/ 2/1/ - 销售主管

这就是我想要使用的层次结构,它是正确的,如果是这样我怎么能这样做,任何人都可以给我一些代码片段.

sql hierarchical hierarchyid sql-server-2008

8
推荐指数
1
解决办法
7011
查看次数