Добавление LinqDataSource где параметры в коде позади - PullRequest
1 голос
/ 25 октября 2011

Чтение простой таблицы с использованием LinqDataSource.Имя таблицы - ZipCode с тремя столбцами: ZipCode, City, State).Чтение работает нормально без фильтра, но когда я добавляю параметры «Где» в LinqDataSource, происходит сбой в привязке данных GridView с ошибкой «Нет свойства или поля« CityValue »в типе« ZipCode ».

» ASPX:

<asp:GridView ID="grdLDS" runat="server" AllowPaging="True" AllowSorting="True" 
    DataSourceID="ldsData" AutoGenerateColumns="False" >
    <Columns>
        <asp:BoundField DataField="ZIPCODE1" HeaderText="ZipCode" SortExpression="ZIPCODE1" />
        <asp:BoundField DataField="CITY" HeaderText="City" SortExpression="CITY" />
        <asp:BoundField DataField="STATE" HeaderText="State" SortExpression="STATE" />
    </Columns>
</asp:GridView>
<asp:LinqDataSource ID="ldsData" runat="server" ContextTypeName="LinqLayer.CommonDataDataContext"
        TableName="ZipCodes" OnSelecting="ldsData_Selecting" OnSelected="ldsData_Selected" >
</asp:LinqDataSource>

Код сзади:

protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
    if (!cbxLDS.Checked)
    {
        e.Cancel = true;
        return;
    }

    ldsData.WhereParameters.Clear();
    StringBuilder where = new StringBuilder();
    if (!string.IsNullOrEmpty(txtFilterByZip.Text))
    {
        where.Append("ZIPCODE1.StartsWith(@ZipValue)");
        ldsData.WhereParameters.Add("@ZipValue", txtFilterByZip.Text);
    }
    if (!string.IsNullOrEmpty(txtFilterByCity.Text))
    {
        if (where.Length > 0) where.Append(" & ");
        where.Append("CITY.StartsWith(@CityValue)");
        ldsData.WhereParameters.Add("@CityValue", txtFilterByCity.Text);
    }

    if (!string.IsNullOrEmpty(txtFilterByState.Text))
    {
        if (where.Length > 0) where.Append(" & ");
        where.Append("STATE.StartsWith(@StateValue)");
        ldsData.WhereParameters.Add("@StateValue", txtFilterByState.Text);
    }

    ldsData.Where = where.ToString();
}

protected void ldsData_Selected(object sender, LinqDataSourceStatusEventArgs e)
{
    LDSRowCount = e.TotalRowCount;
}

private int RefreshLDSData()
{
    grdLDS.DataBind(); // <== CODE FAILS ON THIS LINE
    return LDSRowCount;     
}

private IEnumerable<ZipCode> FilterLDSData(IEnumerable<ZipCode> rows)
{
    return rows;
}

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Благодаря Энди Робинсону, вот решение:

  protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {
        if (!cbxLDS.Checked)
        {
            e.Cancel = true;
            return;
        }
        var dc = new CommonDataDataContext();
        var query = dc.ZipCodes.Select(r => new ZipData()
        {
            ZipCode = r.ZIPCODE1,
            City = r.CITY,
            State = r.STATE,
        });

        e.Result = ldsFilter(query);
    }

    private IQueryable<ZipData> ldsFilter(IQueryable<ZipData> rows)
    {
        if (!string.IsNullOrEmpty(txtFilterByZip.Text))
        {
            rows = rows.Where(r => r.ZipCode.StartsWith(txtFilterByZip.Text));
        }

        if (!string.IsNullOrEmpty(txtFilterByCity.Text))
        {
            rows = rows.Where(r => r.City.StartsWith(txtFilterByCity.Text));
        }

        if (!string.IsNullOrEmpty(txtFilterByState.Text))
        {
            rows = rows.Where(r => r.State.StartsWith(txtFilterByState.Text));
        }

        return rows;
    }

Событие lds_Data_Selecting предоставляет структуру запроса, а метод ldsFilter выполняет динамическую фильтрацию. Этот метод должен принимать и возвращать iQueryable.

0 голосов
/ 25 октября 2011

вы можете попробовать вот так, где параметр с помощью linqdatasource ..

Примечание: это всего лишь пример того, как использовать параметр where с помощью linqdatasource ...

 public void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
 {
    var db = new MyDataContext())
    var subjectFilter = e.WhereParameters("Subject");
    var reporters = from spName in db.spReporter()
                 where spName.Subject.Contains(subjectFilter)
                 select new Reporter(spName.Id, spName.InqDate, spName.Subject);
     e.Result = reporters;
}

Просьба пройтиэта ссылка для подробнее

...