少し強引なやり方かもしれませんが,XMLファイルを読み込む前に,DlにあらかじめDateTime型の列を追加しています.
それは意味がないです。xml ファイルにスキーマを付与して型を指定してから Ds.ReadXml(DataFileName); で読むようにしてください。
Data Tableを捨てているというのはどういうことでしょうか.
private DataTable Dl = new DataTable(); の Dl と Dl = Ds.Tables[0]; の Dl が指すオブジェクトは別物ですよ。
xml ファイルにスキーマがない場合、Ds.ReadXml(DataFileName); で xml ファイルを読んで DataSet/DataTable を作ると、DataTable の全部の列が String 型になるはずです。
スキーマというのがどういうものかと言うと、例えば以下の xml ファイルで <xs:schema ...>...</xs:schema> の部分がそれです。
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Table1">
<xs:complexType>
<xs:sequence>
<xs:element name="ID" type="xs:int" minOccurs="0" />
<xs:element name="Name" type="xs:string" minOccurs="0" />
<xs:element name="Price" type="xs:decimal" minOccurs="0" />
<xs:element name="Discontinued" type="xs:boolean" minOccurs="0" />
<xs:element name="Date" type="xs:dateTime" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<Table1>
<ID>0</ID>
<Name>Product Name_0</Name>
<Price>123000</Price>
<Discontinued>true</Discontinued>
<Date>2018-10-26T10:18:11.9032337+09:00</Date>
</Table1>
<Table1>
<ID>1</ID>
<Name>Product Name_1</Name>
<Price>246000</Price>
<Discontinued>false</Discontinued>
<Date>2018-10-27T10:18:11.9042409+09:00</Date>
</Table1>
・・・中略・・・
</NewDataSet>
kiichi54321 さん、runny_nose さんの回答は DataTable の当該列が DateTime 型であるという前提だと思いますが、そうだとすると DataTable を直さないと話が違ってくると思います。
【追記】
下の私の 2018/10/27 11:23 のコメントで「後で検証して回答欄に追記しておきます」と書きましたが、それを以下に書きます。
上にアップしたスキーマ付きの xml ファイルを DataSet.ReadXml メソッドで DataSet/ DataTable に読み込めば Date 列は DateTime 型になります。
それから前回のスレッド https://teratail.com/questions/153141 の応用で DataRow[] 型のオブジェクトを取得できます。
具体的には、以下のようにすれば、
DataSet dataset1 = new DataSet();
dataset1.ReadXml("xml ファイルのパス");
DataRow[] datarows = (from row in dataset1.Tables[0].AsEnumerable()
let date = row.Field<DateTime>("Date")
where date <= DateTime.Now && date >= DateTime.Now.AddDays(-7)
select row).ToArray();
foreach (DataRow row in datarows)
{
Console.WriteLine($"ID: {row[0]}, Name: {row[1]}, Price: {row[2]}, Discontinued: {row[3]}, Date: {row[4]}");
}
結果は以下のようになります:
ID: 9, Name: Product Name_9, Price: 1230000, Discontinued: False, Date: 2018/10/21 11:10:33
ID: 10, Name: Product Name_10, Price: 1353000, Discontinued: True, Date: 2018/10/22 11:10:33
ID: 11, Name: Product Name_11, Price: 1476000, Discontinued: False, Date: 2018/10/23 11:10:33
ID: 12, Name: Product Name_12, Price: 1599000, Discontinued: True, Date: 2018/10/24 11:10:33
ID: 13, Name: Product Name_13, Price: 1722000, Discontinued: False, Date: 2018/10/25 11:10:33
ID: 14, Name: Product Name_14, Price: 1845000, Discontinued: True, Date: 2018/10/26 11:10:33
【追記2】
下の私の 2018/10/27 15:22 のコメントで「具体的にどのようにするかは後で回答欄に追記しておきます」と書きましたが、それを以下に書きます。
コードを読めばわかると思うのでコードだけ。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string dir = @"どこかの適当なフォルダ";
DataSet ds = CreateDataSource();
string file = "withschema.xml";
ds.WriteXml(dir + file, XmlWriteMode.WriteSchema);
file = "WithoutSchema.xml";
ds.WriteXml(dir + file, XmlWriteMode.IgnoreSchema);
DataSet dataset1 = new DataSet();
DataSet dataset2 = new DataSet();
dataset1.ReadXml(dir + "WithSchema.xml");
dataset2.ReadXml(dir + "WithoutSchema.xml");
Type type1 = dataset1.Tables[0].Columns["Date"].DataType;
Type type2 = dataset2.Tables[0].Columns["Date"].DataType;
Console.WriteLine($"Type: {type1}");
Console.WriteLine($"Type: {type2}");
// 結果は:
// Type: System.DateTime
// Type: System.String
DataRow[] datarows = (from row in dataset1.Tables[0].AsEnumerable()
let date = row.Field<DateTime>("Date")
where date <= DateTime.Now && date >= DateTime.Now.AddDays(-7)
select row).ToArray();
foreach (DataRow row in datarows)
{
Console.WriteLine($"ID: {row[0]}, Name: {row[1]}, Price: {row[2]}, Discontinued: {row[3]}, Date: {row[4]}");
}
// 結果は:
// ID: 9, Name: Product Name_9, Price: 1230000, Discontinued: False, Date: 2018 / 10 / 21 15:27:08
// ID: 10, Name: Product Name_10, Price: 1353000, Discontinued: True, Date: 2018 / 10 / 22 15:27:08
// ID: 11, Name: Product Name_11, Price: 1476000, Discontinued: False, Date: 2018 / 10 / 23 15:27:08
// ID: 12, Name: Product Name_12, Price: 1599000, Discontinued: True, Date: 2018 / 10 / 24 15:27:08
// ID: 13, Name: Product Name_13, Price: 1722000, Discontinued: False, Date: 2018 / 10 / 25 15:27:08
// ID: 14, Name: Product Name_14, Price: 1845000, Discontinued: True, Date: 2018 / 10 / 26 15:27:08
}
// データソース用の DataSet を作成
protected static DataSet CreateDataSource()
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Name", typeof(string)));
dt.Columns.Add(new DataColumn("Price", typeof(decimal)));
dt.Columns.Add(new DataColumn("Discontinued", typeof(bool)));
dt.Columns.Add(new DataColumn("Date", typeof(DateTime)));
for (int i = 0; i < 15; i++)
{
dr = dt.NewRow();
dr["ID"] = i;
dr["Name"] = "Product Name_" + i.ToString();
dr["Price"] = 123000 * (i + 1);
dr["Discontinued"] = (i % 2 == 0) ? true : false;
dr["Date"] = DateTime.Now.AddDays(i - 15);
dt.Rows.Add(dr);
}
DataSet ds = new DataSet();
ds.Tables.Add(dt);
return ds;
}
}
}