最近一个EF+WCF的项目中需要使用Expression传递查询条件,有的条件中会包含对DateTime类型的参数进行判断。
例如最常见的 order=>order.OrderDate > DateTime.Now;
这种用法在正常情况下是没有问题的,但是如果客户端和服务器端的语言区域不一样,就会造成通过WCF传递过后,DateTime类型的变量无法识别。
例如一般中文简体的默认日期格式为yyyy-MM-dd,中文繁体的格式为:yyyy/MM/dd,这样的话,当客户端与服务器端区域语言不同的时候,传参就会报错。
网上找了解决方法,客户端直接修改系统的默认语言格式就好,可以确定保持和服务器统一。
代码如下,一般在程序启动的时候就设定就没问题了。
1 public class LocalLanguage 2 { 3 [DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLCID")] 4 public static extern int GetSystemDefaultLCID(); 5 [DllImport("kernel32.dll", EntryPoint = "SetLocaleInfoA")] 6 public static extern int SetLocaleInfo(int Locale, int LCType, string lpLCData); 7 public const int LOCALE_SLONGDATE = 0x20; 8 public const int LOCALE_SSHORTDATE = 0x1F; 9 public const int LOCALE_STIME = 0x1003; 10 11 public static void SetDateTimeFormat() 12 { 13 try 14 { 15 int x = GetSystemDefaultLCID(); 16 SetLocaleInfo(x, LOCALE_STIME, "HH:mm:ss"); //时间格式 17 SetLocaleInfo(x, LOCALE_SSHORTDATE, "yyyy-MM-dd"); //短日期格式 18 SetLocaleInfo(x, LOCALE_SLONGDATE, "yyyy-MM-dd"); //长日期格式 19 } 20 catch (Exception ex) 21 { 22 Console.WriteLine(ex); 23 } 24 } 25 }