Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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#_Entity Framework_Linq - Fatal编程技术网

C# 将常量解析为字符串不是一个好主意,因为解析依赖于线程的区域性(如果未指定区域性)

C# 将常量解析为字符串不是一个好主意,因为解析依赖于线程的区域性(如果未指定区域性),c#,entity-framework,linq,C#,Entity Framework,Linq,正如您已经注意到的(困难的方式),在LINQtoEntities查询中,您不能使用像LINQtoObject中那样的本地方法。如果希望在数据库中执行整个查询,则需要仅使用支持的结构将逻辑嵌入查询中 话虽如此,SQL查询的等价物应该是这样的 var baseDate = new DateTime(2001, 4, 10); // 10-apr-2001 var minDate = new DateTime(2001, 4, 1); // 1-apr-2001 var maxDate = new

正如您已经注意到的(困难的方式),在LINQtoEntities查询中,您不能使用像LINQtoObject中那样的本地方法。如果希望在数据库中执行整个查询,则需要仅使用支持的结构将逻辑嵌入查询中

话虽如此,SQL查询的等价物应该是这样的

var baseDate = new DateTime(2001, 4, 10); // 10-apr-2001
var minDate = new DateTime(2001, 4, 1);   // 1-apr-2001
var maxDate = new DateTime(2099, 1, 1);   // 1-jan-2099

data = (from e in db.EMPLOYEE
        where workStatus.Contains(e.WORKSTAT)
            && company.Contains(e.CO.Substring(0, 2))
            && ((e.EVENT_TYP != "35") || (e.EVENT_TYP == "35" && !eventReason.Contains(e.EVENT_RSN)))
        let seniorityDate = e.CO_SENIORITY ?? maxDate
        let sortDate = 
            e.CO_SENIORITY == null ? maxDate : 
            e.PREV_CO == "ABC" && e.CO_SENIORITY < baseDate ? minDate :
            e.CO_SENIORITY
        orderby sortDate, seniorityDate, e.BIRTH_DT
        select new Employee
        {
            Co = e.CO,
            CityCode = e.CITY_CODE,
            EmployeeNumber = e.EMP,
            LastName = e.LAST_NAME,
            FirstName = e.FIRST_NAME,
            Position = e.ABV_POSITION_TITLE,
            EmploymentType = e.PART_TIME_IND == "X" ? "PT" : "FT",
            SeniorityDate = e.CO_SENIORITY,
            BirthDate = e.BIRTH_DT,
            PreviousCo = e.PREV_CO
        }).ToList();
这是你的函数

if (CoSeniorityDate == null) CoSeniorityDate = #2099-01-01#
if (PreviousCo == "ABC" && CoSeniorityDate < #2001-04-10#)
    SortDate = #2001-04-01#
else
    SortDate = CoSeniorityDate
由于
#2099-01-01#<#2001-04-10#
总是,因此变得简单

SortDate = #2099-01-01#
i、 与我的标准的第一部分完全相同。在else部分中,我们已经知道
CoSeniorityDate
不是null,可以检查其他条件

不管怎么说,按你的方式做会是这样的

let sortDate = e.PREV_CO == "ABC" && seniorityDate < baseDate ? minDate : seniorityDate
让sortDate=e.PREV_CO==“ABC”&&seniorityDate
将查询转换为“where”之后“select”之前的列表。那会解决的,太好了!我不知道我能做两个这样的选择。我仍在学习EF/LINQ,但在现实世界场景中使用它的次数越多,我学到的就越多。看起来我必须调整一下日期,但这让我非常接近。谢谢你的帮助!酷。很高兴看到它以另一种方式完成。这样更浓缩。这也帮助我调整了一些约会。谢谢你发这个。@Caveman欢迎你。请注意,如果可能的话,这是一种比在中间列出可计算的、在内存中完成其余部分更可取的方法。@Ivan…我已经更新了上面的问题。你对我如何调整OrderBy有什么建议吗?@Caverman你试过我写的方式吗?在我看来,它应该会产生所需的订单。是的,我执行了你发送的内容,而且非常非常接近。事实上,一开始它似乎只遗漏了我发布的原始OrderBy声明中的第二个OrderBy。这就是为什么我开始研究LinqPad中的SQL输出。顺便说一句:我更新了我的更新答案以包含我的LinqPad查询。
ORDER BY (CASE WHEN ((t0.PREV_CO = :p10) AND (COALESCE(t0.CO_SENIORITY, :p11) < :p12) THEN :p13 ELSE COALESCE(t0.CO_SENIORITY, :p11) END)
void Main()
{
    var workStatus = new string[] { "1", "3" };
    var company = new string[] { "EX", "SM" };
    var eventReason = new string[] { "21", "22", "23" };

    var baseDate = new DateTime(2001, 4, 10);  // 10-apr-2001
    var minDate = new DateTime(2001, 4, 1);    // 1-apr-2001
    var abcDate = new DateTime(2001, 4, 10);   // 10-apr-2001
    var maxDate = new DateTime(2099, 1, 1);    // 1-jan-2099

    var data = (from e in SAP_EMPLOYEE
                where workStatus.Contains(e.WORKSTAT)
                        && e.PERS_SUB_AREA == "200A"
                        && company.Contains(e.CO.Substring(0, 2))
                        && e.CO != "EXGS"
                        && ((e.EVENT_TYP != "35") || (e.EVENT_TYP == "35" && !eventReason.Contains(e.EVENT_RSN)))
                orderby e.PREV_CO == "ABC" && e.CO_SENIORITY == null ? maxDate : e.CO_SENIORITY < abcDate ? minDate : e.CO_SENIORITY ?? maxDate,
                e.CO_SENIORITY ?? maxDate,
                e.BIRTH_DT
                    select new Employee
                    {
                        Co = e.CO,
                        CityCode = e.CITY_CODE,
                        EmployeeNumber = e.EMP,
                        LastName = e.LAST_NAME,
                        FirstName = e.FIRST_NAME,
                        Position = e.ABV_POSITION_TITLE,
                        EmploymentType = e.PART_TIME_IND == "X" ? "PT" : "FT",
                        SeniorityDate = e.CO_SENIORITY == null ? maxDate :
                            e.PREV_CO == "ABC" && e.CO_SENIORITY < twaDate ? maxDate : e.CO_SENIORITY,
                        LOA = e.WORKSTAT == "1" ? "LOA" : "",
                        ABC = e.PREV_CO == "ABC" ? "ABC" : "",
                        BirthDate = e.BIRTH_DT,
                        PreviousCo = e.PREV_CO
                    }).ToList();

    data.Dump();
}
data = (from e in db.EMPLOYEE
           where workStatus.Contains(e.WORKSTAT)
               && company.Contains(e.CO.Substring(0, 2))
               && ((e.EVENT_TYP != "35") || (e.EVENT_TYP == "35" && !eventReason.Contains(e.EVENT_RSN)))
        select new ()
        {
            Co = e.CO,
            CityCode = e.CITY_CODE,
            EmployeeNumber = e.EMP,
            LastName = e.LAST_NAME,
            FirstName = e.FIRST_NAME,
            Position = e.ABV_POSITION_TITLE,
            EmploymentType = e.PART_TIME_IND == "X" ? "PT" : "FT",
            SeniorityDate = e.CO_SENIORITY,
            BirthDate = e.BIRTH_DT,
            PreviousCo = e.PREV_CO
        }).ToList().Select(x => new Employee() 
               {
                 Co = x.Co,
                 CityCode = x.CityCode,
                 EmployeeNumber = x.EmployeeNumber,
                 LastName = x.LastName,
                 FirstName = x.FirstName,
                 Position = x.Position,
                 EmploymentType = x.EmploymentType,
                 SeniorityDate = x.SeniorityDate ?? DateTime.MaxValue,
                 BirthDate = x.BirthDate,
                 SortByDate = GetSortDate(x.PreviousCo, x.SeniorityDate),
                 PreviousCo = x.PreviousCo
               }).OrderBy(o => o.SortByDate)
                   .ThenBy(o => o.SeniorityDate)
                   .ThenBy(o => o.BirthDate).ToList();
// Culture dependent
sortDate = System.DateTime.Parse("2001-04-01");
// Better
sortDate = new DateTime(2001, 04, 01);
var baseDate = new DateTime(2001, 4, 10); // 10-apr-2001
var minDate = new DateTime(2001, 4, 1);   // 1-apr-2001
var maxDate = new DateTime(2099, 1, 1);   // 1-jan-2099

data = (from e in db.EMPLOYEE
        where workStatus.Contains(e.WORKSTAT)
            && company.Contains(e.CO.Substring(0, 2))
            && ((e.EVENT_TYP != "35") || (e.EVENT_TYP == "35" && !eventReason.Contains(e.EVENT_RSN)))
        let seniorityDate = e.CO_SENIORITY ?? maxDate
        let sortDate = 
            e.CO_SENIORITY == null ? maxDate : 
            e.PREV_CO == "ABC" && e.CO_SENIORITY < baseDate ? minDate :
            e.CO_SENIORITY
        orderby sortDate, seniorityDate, e.BIRTH_DT
        select new Employee
        {
            Co = e.CO,
            CityCode = e.CITY_CODE,
            EmployeeNumber = e.EMP,
            LastName = e.LAST_NAME,
            FirstName = e.FIRST_NAME,
            Position = e.ABV_POSITION_TITLE,
            EmploymentType = e.PART_TIME_IND == "X" ? "PT" : "FT",
            SeniorityDate = e.CO_SENIORITY,
            BirthDate = e.BIRTH_DT,
            PreviousCo = e.PREV_CO
        }).ToList();
if (CoSeniorityDate == null)
    SortDate = #2099-01-01#
else if (PreviousCo == "ABC" && CoSeniorityDate < #2001-04-10#)
    SortDate = #2001-04-01#
else
    SortDate = CoSeniorityDate
if (CoSeniorityDate == null) CoSeniorityDate = #2099-01-01#
if (PreviousCo == "ABC" && CoSeniorityDate < #2001-04-10#)
    SortDate = #2001-04-01#
else
    SortDate = CoSeniorityDate
if (PreviousCo == "ABC" && #2099-01-01# < #2001-04-10#)
    SortDate = #2001-04-01#
else
    SortDate = #2099-01-01#
SortDate = #2099-01-01#
let sortDate = e.PREV_CO == "ABC" && seniorityDate < baseDate ? minDate : seniorityDate