1

このタイプの SQL ステートメントのような LINQ ステートメントを生成したい

SELECT *
FROM   dbo.tbl_Advertisement
WHERE  FileName LIKE '%latest%'
       AND ToDate = (SELECT min(ToDate)
                     FROM   dbo.tbl_Advertisement
                     WHERE  CAST (getdate() AS DATE) <= CAST (Todate AS DATE)
                            AND FromDate = (SELECT max(FromDate)
                                            FROM   dbo.tbl_Advertisement
                                            WHERE  CAST (getdate() AS DATE) >= CAST (FromDate AS DATE)));

次のようにLinqステートメントを生成しました:

objAdvList = objAdvList
            .Where(x => x.ToDate == Convert.ToDateTime(objAdvList
                .Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
                .Select(y => y.FromDate)
                ))
                .Select(x => x)
                .ToList();

objAdvList は List タイプのコレクションです。

class AdvertisementAccess
{
    public DateTime FromDate { get; set; }
    public DateTime ToDate { get; set; }
    public string FileName { get; set; }
    public string Path { get; set; }
}

しかし、このコードでは次のようなエラー メッセージが表示されます。

タイプ 'WhereSelectListIterator`2[AdvertisementAccess,System.DateTime]' のオブジェクトをタイプ 'System.IConvertible' にキャストできません。

私の問題を解決する人はいますか?

よろしく、マヤンク

4

5 に答える 5

4

内部クエリは一連の結果になります。ただし、Convert.ToDateTime単一の値を探しています。SingleFirst、またはのいずれかを使用Lastして、内部クエリによって生成されたこの一連の値から値を選択できます。

内部 LINQ クエリの結果のみSingleを取得するために使用するには、次のコードを試してください。

objAdvList = objAdvList
    .Where(x => x.ToDate == objAdvList
        .Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
        .Select(y => y.FromDate).Single()
    )
    .ToList();

または、可能性のリストから最初の結果を選択する必要がある場合は、First代わりに次を使用します。

objAdvList = objAdvList
    .Where(x => x.ToDate == objAdvList
        .Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
        .Select(y => y.FromDate).First()
    )
    .ToList();

.Select(x => x)どちらの場合も、何もしない式を削除しました。この式は単にすべての値xを選択し、変換せずに返します。

Convert.ToDateTimeすでに 2 つの日付を比較しているため、への呼び出しも削除しました。日付値を日付に変換する必要はありません。

于 2013-07-08T12:40:18.530 に答える
1

最初の呼び出しの引数はConvert.ToDateTime()列挙型です。必ず接尾辞を付けてください.FirstOrDefault()or Single()

objAdvList = objAdvList
            .Where(x => x.ToDate == Convert.ToDateTime(objAdvList
                .Where(y => y.FromDate == Convert.ToDateTime(objAdvList.Max(z => z.FromDate)))
                .Select(y => y.FromDate)
                .FirstOrDefault()
                ))
                .Select(x => x)
                .ToList();
于 2013-07-08T12:40:05.307 に答える
0

迅速かつ有用な回答をくださった皆様に感謝します。あなたの助けを借りて、以下に示すSQLステートメントの代わりとして私の要件を満たすことができるLinqステートメントを生成しました:

SELECT *
FROM   dbo.tbl_Advertisement
WHERE  ToDate = (SELECT min(ToDate)
                     FROM   dbo.tbl_Advertisement
                     WHERE  FromDate = (SELECT max(FromDate)
                                            FROM   dbo.tbl_Advertisement))

私のLinqステートメントは次のとおりです。

objAdvList = objAdvList
            .Where(x => x.ToDate.Date == objAdvList
                .Where(y => y.FromDate.Date == objAdvList.Max(z => z.FromDate.Date))
                .Select(y => y.ToDate.Date).Min()
                )
                .Select(x => x)
                .ToList();

もう一度ありがとう、マヤンク

于 2013-07-09T05:08:16.643 に答える
0

元のクエリは少し奇妙に見えますが、エンティティを介して LINQ に変換すると次のようになります。

var objAdvList=objAdvList
     .Where(a=>a.Filename.Contains("latest"))
     .Where(a=>a.ToDate==objAdvList
         .Where(a2=>EntityFunctions.TruncateTime(DateTime.Now)<=EntityFunctions.TruncateTime(a2.FromDate))
         .Where(a2=>EntityFunctions.TruncateTime(a2.FromDate)<=objAdvList
             .Where(a3=>EntityFunctions.TruncateTime(DateTime.Now)>=EntityFunctions.TruncateTime(a3.FromDate))
             .Max(a3=>a3.FromDate))
         .Min(a2=>a2.ToDate))
于 2013-07-08T18:27:38.233 に答える