我正在重新设计一个客户数据库,我想要存储的一条新信息以及标准地址字段(街道,城市等)是地址的地理位置.我想到的唯一用例是允许用户在无法找到地址时映射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) 在研究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) 我想比较两个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) 我正在使用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) 我在SSDT中有一个数据库项目,当我导入一个引用不同数据库中的对象的视图时,我得到错误SQL71561,其中的描述如下:
错误4 SQL71561:视图:[schema].[viewname]有一个未解析的对象[other_db]的引用.[schema].[table].[column]
我花了一些时间试图解决这个问题,所以为了帮助其他人遇到这个,我会发布对我有用的答案.
我想在日期时间字段的日期部分做一个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".仅支持初始值设定项,实体成员和实体导航属性.
我如何按日期而不是日期和时间进行分组?
给定一个值数组,我想创建一个具有基于这些值的属性的匿名对象.属性名称只是数组中值的索引"pN"所在N.
例如,给定
object[] values = { 123, "foo" };
我想创建一个匿名对象
new { p0 = 123, p1 = "foo" };
我能想到的唯一方法就是使用一个switch或if链到一个合理数量的参数来支持,但我想知道是否有更优雅的方法来做到这一点:
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)
背景 …
我需要通过特殊方式为照片添加水印.我知道怎么做,但我不知道如何做到这一点与文章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) 我使用的是EF 4.2,但我希望这也适用于EF 4和4.1.
我想通过一个IQueryable<T>和多个Expression<Func<TSource, TKey>>的方法和具有应用该方法OrderBy,并ThenBy在IQueryable<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
我想像这样插入hierarchyId
/ - CEO(根)
/ 1/ - 采购经理/ 2/ - 销售经理
/ 1/1/ - 采购主管/ 2/1/ - 销售主管
这就是我想要使用的层次结构,它是正确的,如果是这样我怎么能这样做,任何人都可以给我一些代码片段.
c# ×4
linq ×3
sql-server ×2
algorithm ×1
automapper ×1
c#-4.0 ×1
comparison ×1
concurrency ×1
dapper ×1
dictionary ×1
geocoding ×1
geolocation ×1
group-by ×1
hierarchical ×1
hierarchyid ×1
locking ×1
sql ×1
t-sql ×1
winforms ×1