3

以下のような API メソッドがあります。

IQueryable を追加して、最後のクエリに where ステートメントを実行するための項目のリストを含めることは可能ですか、それとも SqlQuery プロパティを使用して生の SQL 文字列を作成する必要がありますか。

    public IEnumerable<Message> GetMessagesFromApi(DateTime? dateFrom = null, DateTime? dateTo = null, int flag = -1, int messageType = 1, bool media =false)
    {
        if (dateFrom == null)
            dateFrom = DateTime.MinValue;

        if (dateTo == null)
            dateTo = DateTime.MaxValue;

        IQueryable<Message> query = null;


        query = db.Messages.Where(x => x.Created >= dateFrom && x.Created <= dateTo);


        if (flag >= 0)
        {
            //Append the where statement on dates to now include Flag
            query = query.Where(x => x.Flag == flag);
        }

       //Here it should execute against Where date >= and date <= and flag = 1
    }
4

1 に答える 1

2

IQueryable を追加して、最後のクエリに where ステートメントを実行する項目のリストを含めることはできますか?

はい。あなたのコードは正常に動作するはずです。結果の を構築したい場合は、これを実行するだけですIEnumerable<Message>

//Here it should execute against Where date >= and date <= and flag = 1
return query.ToList();

を使用したり、直接AsEnumerable()返すこともできますが( implementsであるため)、これは、各列挙が DB にヒットするため、ユーザーが結果を複数回列挙すると問題を引き起こすことに注意してください。queryIQueryable<T>IEnumerable<T>

私は個人的にこれを次のように書きます:

public IEnumerable<Message> GetMessagesFromApi(DateTime? dateFrom = null, DateTime? dateTo = null, int flag = -1, int messageType = 1, bool media =false)
{
    IQueryable<Message> query = db.Messages;

    if(dateFrom.HasValue)
        query = query.Where(x => x.Created >= dateFrom);
    if(dateTo.HasValue)
        query = query.Where(x => x.Created <= dateTo);
    if(flag >= 0)
        query = query.Where(x => x.Flag == flag);
    // others as needed, such as media...

    return query.ToList();
}
于 2013-03-28T16:16:15.747 に答える