我们有一个大型数据库,我们有数据库端分页.这很快,在几分之一秒内从数百万条记录中返回50行的页面.
用户可以定义自己的排序,基本上选择要排序的列.列是动态的 - 一些具有数值,一些日期和一些文本.
虽然大多数按预期文本排序是愚蠢的.嗯,我说愚蠢,它对计算机有意义,但让用户感到沮丧.
例如,按字符串记录ID排序会产生如下内容:
rec1
rec10
rec14
rec2
rec20
rec3
rec4
Run Code Online (Sandbox Code Playgroud)
...等等.
我希望这个考虑到这个数字,所以:
rec1
rec2
rec3
rec4
rec10
rec14
rec20
Run Code Online (Sandbox Code Playgroud)
我无法控制输入(否则我只是在前导000中格式化)而且我不能依赖单一格式 - 有些类似于"{alpha code} - {dept code} - {rec id}".
我知道在C#中有几种方法可以做到这一点,但是不能拉下所有记录来对它们进行排序,因为这样会慢.
有谁知道在Sql server中快速应用自然排序的方法?
我们正在使用:
ROW_NUMBER() over (order by {field name} asc)
Run Code Online (Sandbox Code Playgroud)
然后我们就这样分页.
我们可以添加触发器,但我们不会.他们所有的输入都是参数化的,但是我无法改变格式 - 如果他们输入"rec2"和"rec10",他们希望它们就像那样,以自然的顺序返回.
我们有有效的用户输入,遵循不同客户的不同格式.
有人可能会去rec1,rec2,rec3,... rec100,rec101
而另一个可能会去:grp1rec1,grp1rec2,... grp20rec300,grp20rec301
当我说我们无法控制输入时,我的意思是我们不能强迫用户更改这些标准 - 它们有一个像grp1rec1的值,我不能将其重新格式化为grp01rec001,因为这会改变用于查找的内容和链接到外部系统.
这些格式变化很大,但通常是字母和数字的混合.
在C#中对它们进行排序很容易 - 只需将其分解{ "grp", 20, "rec", 301 },然后依次比较序列值.
但是,可能有数百万条记录并且数据被分页,我需要在SQL服务器上进行排序.
SQL服务器按值排序,而不是比较 - 在C#中我可以将值拆分为比较,但在SQL中我需要一些逻辑(非常快)获得一致排序的单个值.
@moebius - 你的答案可能会有效,但是为所有这些文本值添加排序键确实感觉像是一个丑陋的妥协.
ASP.NET Core使用扩展方法IServiceCollection来设置依赖注入,然后当需要类型时,它使用适当的方法来创建新实例:
AddTransient<T> - 添加每次请求时再次创建的类型.AddScoped<T> - 添加为请求范围保留的类型.AddSingleton<T> - 在第一次请求时添加一个类型并保持它.我有类型的实现IDisposable,如果没有处理它们会导致问题 - 在Dispose实际调用的每个模式中?
有什么我需要添加(例如异常处理)以确保实例始终处置?
我需要在浏览器中显示Word .doc和.docx文件.没有真正的客户端方式,出于法律原因,这些文档无法与Google文档或Microsoft Office 365共享.
浏览器无法显示Word,但可以显示PDF,因此我想在服务器上将这些文档转换为PDF然后显示.
我知道这可以使用Microsoft.Office.Interop.Word,但我的应用程序是.NET Core,并且无法访问Office互操作.它可以在Azure上运行,但它也可以在Docker容器中运行.
似乎有很多类似的问题,但大多数人都在询问全框架.NET或假设服务器是Windows操作系统,任何答案对我都没用.
如何转换.doc和.docx文件.pdf 无法访问Microsoft.Office.Interop.Word?
看起来应该可以使用以下内容:
.verticalText
{
/* IE-only DX filter */
writing-mode: tb-rl;
filter: flipv fliph;
/* Safari/Chrome function */
-webkit-transform: rotate(270deg);
/* works in latest FX builds */
-moz-transform: rotate(270deg);
}
Run Code Online (Sandbox Code Playgroud)
这适用于IE.
它在Safari,Chrome和FX中以奇怪的方式出错 - 在文本旋转之前计算单元格的大小!

这是一个演示:http://jsfiddle.net/HSKws/
我使用动态图像作为解决方法,虽然这也存在问题.我很高兴作为一个后备,但似乎应该有一种方法来使这个CSS工作 - 它几乎就在那里.
任何人都知道在应用变换后让单元格适合内容的方法吗?
我有一个显示垂直文本的多浏览器页面.
作为一个丑陋的黑客,让文本在所有浏览器中垂直渲染我创建了一个自定义页面处理程序,它返回一个垂直绘制文本的PNG.
这是我的基本代码(C#3,但对其他任何版本的细微更改为1):
Font f = GetSystemConfiguredFont();
//this sets the text to be rotated 90deg clockwise (i.e. down)
StringFormat stringFormat = new StringFormat { FormatFlags = StringFormatFlags.DirectionVertical };
SizeF size;
// creates 1Kx1K image buffer and uses it to find out how bit the image needs to be to fit the text
using ( Image imageg = (Image) new Bitmap( 1000, 1000 ) )
size = Graphics.FromImage( imageg ).
MeasureString( text, f, 25, stringFormat );
using ( Bitmap image = …Run Code Online (Sandbox Code Playgroud) 您应该能够创建一个通用表单:
public partial class MyGenericForm<T> :
Form where T : class
{
/* form code */
public List<T> TypedList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
是有效的C#,并编译.但是,如果您有任何图像表明它无法找到资源,那么设计器将无法工作,表单将抛出运行时异常.
我认为这是因为windows表单设计者假定资源将以简单类型的名称存储.
我正在使用MSBuild构建我的东西.我想通过Build Server使用CruiseControl.net.
现在,CCNET对nAnt进行了大量的讨论,但看起来ccnet可以通过项目配置和msbuild完成大部分工作.此外,nAnt似乎有点不受支持,Beta版本已经差不多一年了.
简而言之:我实际上对MSBuild非常满意(特别是因为它是"官方"编译器前端)并且对nAnt有点不舒服,但我不想过早判断.
使用nAnt而不是MSBuild会有什么理由?特别是ccnet,在功能方面似乎与nant重叠(并添加了自动构建相关的东西)
我datetime在一个非常大的表中有一个SQL 字段.它已编入索引,需要进行查询.
问题是SQL总是存储时间组件(即使它始终是午夜),但搜索是在当天而不是时间.
declare @dateVar datetime = '2013-03-11;
select t.[DateColumn]
from MyTable t
where t.[DateColumn] = dateVar;
Run Code Online (Sandbox Code Playgroud)
不会返回任何内容,因为它t.[DateColumn]总是包含一个时间组件.
我的问题是围绕这个最好的方法是什么?
似乎有两组主要选择:
使用dateadd和创建第二个变量并使用between ... and或>= ... and ... <=.
转换t.[DateColumn]为仅限日期的组件 - 我认为这将导致任何索引被忽略.
这两个看起来都非常混乱 - 我真的不想进行范围比较或扫描表格.
有没有更好的办法?
如果其中一个选项始终是最佳方式,那么如何以及为什么?
我遇到过ASP会话的好奇行为.您可以强制控制器在用户会话之外 - 我希望能够执行此操作,以便可以同时执行多个请求并使用会话使它们连续执行.
禁用会话状态按预期工作:
[SessionState(SessionStateBehavior.Disabled)]
public class SampleController : Controller
{
public ActionResult Test()
{
// Access to the session should be denied
object test = Session["test"];
return Content(test);
}
}
Run Code Online (Sandbox Code Playgroud)
转到〜/ Sample/Test会抛出一个System.Web.HttpException,如预期的那样.但是,只读会话似乎有点奇怪:
[SessionState(SessionStateBehavior.ReadOnly)]
public class SampleController : Controller
{
public ActionResult Test()
{
// Read from the session should be fine
object test = Session["test"];
return Content(test);
}
public ActionResult SetTest(string value)
{
// Write to the session should fail
Session["test"] = value;
// Read …Run Code Online (Sandbox Code Playgroud) .Net 3.5中的新扩展允许从接口拆分功能.
例如在.Net 2.0中
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
List<IChild> GetChildren()
}
Run Code Online (Sandbox Code Playgroud)
可以(在3.5中)成为:
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
}
public static class HaveChildrenExtension {
public static List<IChild> GetChildren( this IHaveChildren ) {
//logic to get children by parent type and id
//shared for all classes implementing IHaveChildren
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这对于许多接口来说是更好的机制.他们不再需要抽象基础来共享此代码,并且功能上代码的工作原理相同.这可以使代码更易于维护和更容易测试.
唯一的缺点是抽象基础实现可以是虚拟的,但可以解决(实例方法是否会隐藏具有相同名称的扩展方法?这会使代码混淆吗?)
没有经常使用这种模式的任何其他原因?
澄清:
是的,我看到扩展方法的趋势是到处都是它们.如果没有大量的同行评审,我会特别小心使用.Net值类型(我认为我们在字符串上唯一的一个是.SplitToDictionary()- 类似于.Split()但也采用键值分隔符)
我认为那里有一个完整的最佳实践辩论;-)
(顺便说一下:DannySmurf,你的PM听起来很可怕.)
我在这里特别询问使用扩展方法,以前我们有接口方法. …
c# ×4
.net ×3
.net-3.5 ×2
.net-core ×2
sql-server ×2
asp.net-core ×1
asp.net-mvc ×1
css ×1
datetime ×1
gdi+ ×1
idisposable ×1
ms-word ×1
msbuild ×1
nant ×1
natural-sort ×1
pdf ×1
session ×1
sorting ×1
sql ×1
t-sql ×1
winforms ×1