1

ASP.Net アプリケーションで jQuery Bootgrid を実装しようとして、何日も苦労しています。これまでのところ、これは私が持っているものです:(順序による機能はまだ機能していません。後でそれに取り組みます)

public JsonResult IndexJson(RequestData model)
{
    var result = (from x in db.ContactSet
        select new
        {
            x.AccountId,
            x.FirstName,
            x.LastName,
            x.FullName,
            x.JobTitle,
            x.ParentCustomerId,
            x.EMailAddress1,
            x.Telephone1,
            x.MobilePhone,
            x.Fax,
            x.GenderCode,
            x.BirthDate
        }); //? Gets all rows

    result = (from x in result
        where x.FirstName.Contains(model.searchPhrase)
            || x.LastName.Contains(model.searchPhrase)
        select x); //? Search Filter

    var totalRows = result.Count(); //? Sets totalRows (for ResponseData)

    if (model.rowCount == -1)
        model.rowCount = totalRows; //? In case View All Rows is selected by Bootgrid (for ResponseData)

    // TODO: Add Order By functionality

    var tResult = new ResponseData<object>()
    {
        current = model.current,
        rowCount = model.rowCount,
        rows = result.ToList(),
        total = totalRows
    }; //? Builds Json Response

    return Json(tResult, JsonRequestBehavior.AllowGet);
}

このコードの問題は、検索機能の後にレコードの総数をカウントする必要があることです。私は LINQ クエリを適切に使用することにあまり熟練していません。

到達するまでvar totalRows = result.Count();に、次のエラーが表示されます。

System.NotSupportedException: 'メソッド 'Where' はメソッド 'Select' に従うことができないか、サポートされていません。サポートされているメソッドに関してクエリを記述してみるか、サポートされていないメソッドを呼び出す前に、'AsEnumerable' または 'ToList' メソッドを呼び出してください。

ここで何が問題なのですか?

4

1 に答える 1

0

サーバー側のページングの実装や昇順、降順の並べ替えなど、さまざまな状況でブートグリッドを使用してきましたが、問題はありませんでした。

これを試して:

//Let's assume this is your model....
public class RequestData
{
    public int RowCount { get; set; }
    public int Current { get; set; }
    public string Search { get; set; }
    public string SortBy { get; set; }
    public string SortDirection { get; set; }
    public int TotalItems { get; set; }
}

1.DB テーブルのすべての列を選択していない場合は、選択した列をマップする DTO を作成します。それ以外の場合は、この部分をスキップして、ContactSetDTO が表示されている場所を ContactSet に置き換えます

public class ContactSetDTO
{
    public string AccountId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get; set; }         
    public string JobTitle { get; set; }         
    public string ParentCustomerId { get; set; }
    public string EMailAddress1 { get; set; }
    public string Telephone1 { get; set; }
    public string MobilePhone { get; set; }
    public string Fax { get; set; }
    public string GenderCode { get; set; }
    public DateTime BirthDate { get; set; }
}

2.SQL Server を使用していると仮定すると、次の方法を使用してカウントを取得できます。

 public int getContactSetCount(string searchPhrase)
 {
    int ret = 0;
    try
    {
        string query = string.Empty;
        if (!string.IsNullOrWhiteSpace(searchPhrase))
        {
            // ********* Assuming your db table is also called ContactSet **********************
            query = @"SELECT COUNT(*) FROM ContactSet s WHERE s.FirstName LIKE '%' + @p0 + '%' OR s.LastName LIKE '%' + @p0 + '%')";
            ret = db.Database.SqlQuery<int>(query, new System.Data.SqlClient.SqlParameter(parameterName: "@p0", value: searchPhrase)).FirstOrDefault();
        }
        else
        {
            ret = db.ContactSet.Count();
        }
    }
    catch (Exception)
    {
         throw;
    }

    return ret;
}

3.最後に、メソッドは次のようになります。

public JsonResult IndexJson(RequestData model)
{
     var searchPhrase = model.Search;

     if (!string.IsNullOrWhiteSpace(searchPhrase))
     {
         //Notice that the select columns match the ContactSetDTO properties
         string query = @"SELECT TOP " + model.RowCount + " s.AccountId, s.FirstName, s.LastName, s.FullName, s.JobTitle, s.ParentCustomerId, s.EmailAddress1, s.Telephone1, s.MobilePhone, s.Fax, s.GenderCode, s.BirthDate FROM ContactSet s WHERE s.FirstName LIKE '%' + @p0 + '%' OR s.LastName LIKE '%' + @p0 + '%')";

   //Then, this should return a list of ContactSetDTO for you
    var result = db.Database.SqlQuery<ContactSetDTO>(query, new System.Data.SqlClient.SqlParameter(parameterName: "@p0", value: searchPhrase)).ToList();

     var totalRows = getContactSetCount(searchPhrase);

     var tResult = new { rows = result, rowCount = model.RowCount, total = totalRows, current = model.Current, searchPhrase = model.Search }
    };

    return Json(tResult, JsonRequestBehavior.AllowGet);
}

上記が役立つことを願っています。

于 2017-06-27T16:52:01.323 に答える