在C#Linq中使用T-SQL DATEFROMPARTS()

时间:2017-11-24 11:48:49

标签: c# sql-server linq

我有以下T-SQL查询,我试图将其转换为C#代码:

SELECT 
    *, DATEFROMPARTS(Jaar, Maand, 1) 
FROM 
    EAN_Budget_Meetdata_Factuur
WHERE
    EID = 1 AND
    Bron = 'B' AND
    DATEFROMPARTS(Jaar, Maand, 1)  BETWEEN '20161101' AND '20170101' 

该表包含一年和一月的列,我根据两个已知的DateTimes(一个句点)查询该表。

该查询旨在根据两个DateTime之间的年份和月份检索适用于此期间的表行。

将此查询转换为C#的最佳方法是什么?到目前为止,我已经提出以下建议,但没有成功:

var query = from b in CT2.EAN_Budget_Meetdata_Factuur
            let JaarTest = b.Jaar + "-" + b.Maand + "-01"
            where 
                b.EID == 1 &&
                b.Bron == "B" &&
                JaarTest == "something"
                select new
                {
                    JaarTest = b.Jaar + "-" + b.Maand + "-01"
                };

2 个答案:

答案 0 :(得分:1)

请尝试以下操作:

    class Program
    {
        static void Main(string[] args)
        {
            var query = EAN_Budget_Meetdata_Factuur.factuurs
                    .Where(x => (x.eid == 1) && (x.bron == "B") && (x.date >= new DateTime(2016, 11, 1)) && (x.date <= new DateTime(2017, 1, 1)))
                    .Select(x => new { eid = x.eid, bron = x.bron, date = x.date })
                    .ToList();
        }
    }
    public class EAN_Budget_Meetdata_Factuur
    {
        public static List<EAN_Budget_Meetdata_Factuur> factuurs = new List<EAN_Budget_Meetdata_Factuur>();

        public int eid { get; set; }
        public string bron { get; set; }
        public DateTime date { get; set; }
    }

答案 1 :(得分:1)

如果您在表格列上使用DATEFROMPARTS,那么您已经失去了索引在数据库方面有用的任何机会 - 所以我建议您在整个月内工作。 1

(year * 12) + months是一个简单的计算,您可以使用表列和要查询的任何起点/终点执行,然后您可以执行简单的int范围检查。

1 或者,如果您还没有意识到这会拒绝任何索引功能,您可能需要考虑添加计算列您应用索引的情况 - 在这种情况下,列定义将使用该函数(我在此处给出的总月计算或原始DATEFROMPARTS一个),然后您可以轻松地查询该列。