Ссылочная проблема в C # для IQueryable - PullRequest
0 голосов
/ 16 сентября 2011

Код:

public static IQueryable GetAllBy_HesapAdiFirmaAdiCariNo_Turu_bypage_short(string filter, string tip, int page_size, int page_index, string sortcolumn, bool sortdirection)
{
    //bool tip: 0-tümü, 1-son kullanici, 2-bayi, 3- tedarikçi
    VeriyazDBDataContext db = new VeriyazDBDataContext(); db.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
    var cariKayitlari = DAL.DAOCari.SelectAll();
    var kayitlar = (from rows in cariKayitlari
                    where rows.HESAPADI.ToLower().Contains(filter.ToLower()) ||
                        (rows.CARITURU == "Bireysel" ? rows.B_ADSOYAD.ToLower().Contains(filter.ToLower()) : 
                                                        rows.K_FIRMAADI.ToLower().Contains(filter.ToLower())) ||
                        (rows.CARITURU == "Bireysel" ?
                        rows.B_ADSOYAD.ToLower().Contains(filter.ToUpper()) :
                        rows.K_FIRMAADI.ToLower().Contains(filter.ToUpper())) ||                                   
                        rows.ID.ToString().Contains(filter)
                    select rows);

    switch (tip)
    {
        case ("Tümü"):
        default:
        {
            break;
        }
        case ("Son Kullanici"):
        {
            kayitlar = kayitlar.Where(rows => rows.SONKULLANICI == true);
            break;
        }
        case ("Bayi"):
        {
            kayitlar = kayitlar.Where(rows => rows.BAYI == true);
            break;
        }
        case ("Tedarikçi"):
        {
            kayitlar = kayitlar.Where(rows => rows.TEDARIKCI == true);
            break;
        }
    }

    var kayitlar2 = from rows in kayitlar
                    select new
                    {
                        HESAPNO = rows.ID,
                        HESAPADI = rows.HESAPADI,
                        CARIADI = (rows.CARITURU == "Bireysel" ? rows.B_ADSOYAD : rows.K_FIRMAADI)
                        //BAKIYE= "",
                        //PARABIRIMI = rows.LISTEPARABIRIMI
                    };

    if (sortcolumn != "")
    {
        if (sortdirection)
            kayitlar2 = kayitlar2.Order(sortcolumn, SortDirection.Ascending).AsQueryable();
        else
            kayitlar2 = kayitlar2.Order(sortcolumn, SortDirection.Descending).AsQueryable();
    }

    return kayitlar2.Skip(page_size * (page_index)).Take(page_size);
}

Я вызывал этот метод из двух разных System.Web.UI.Page классов в приведенном ниже методе

  1. CariHesaplar
  2. YeniBilet.


private void cari_paging_button_yenile()
{
    Button_CariIleri.Enabled = true;
    Button_CariGeri.Enabled = true;

    if (CariPageIndex == 0)
        Button_CariGeri.Enabled = false;
    string tumu = "Tümü";

    if (DAL.DAOCari.GetAllBy_HesapAdiFirmaAdiCariNo_Turu_bypage_short(TextBox_CariArama.Text, tumu, CariPageSize, CariPageIndex + 1, CariSortColumn, CariSortDirection).Count() == 0)//problem occured in this row
        Button_CariIleri.Enabled = false;
}

Проблема: Когда я звоню GetAllBy_HesapAdiFirmaAdiCariNo_Turu_bypage_short в CariHesaplar, я могу получить счет в операторе if в cari_paging_button_yenile(). Однако, в YeniBilet, когда я пытаюсьчтобы получить Count () я получаю

Ошибка 19 «System.Linq.IQueryable» не содержит определения для «Count» и нет метода расширения «Count», принимающего первый аргумент типа 'System.Linq.IQueryable 'может быть найдено (вам не хватает директивы using или ссылки на сборку?) C: \ Users \ yigit \ Desktop \ PROTicari (11.04.2011) \ UI \ MusteriDestek \ YeniBilet.aspx.cs 257 17 UI

Я пытался решить многие проблемы, но ничего не помогло. Впоследствии я подумал, что это может быть пропущенный оператор using в начале страницы. Я проверил оба класса using sтолько разные были using System.Linq.Dynamic; но у них обоих было using System.Linq; так что я думал, что это не моглоЭто не проблема. Но тогда я написал using System.Linq.Dynamic; на YeniBilet, который тоже выдавал ошибку, и ошибка исчезла.

У меня вопрос, почему ссылка using System.Linq.Dynamic; не добавляется, когда на странице уже есть using System.Linq; не Linq.Dynamic как подмножество Linq? Почему я должен снова добавить его ссылку?

Ответы [ 4 ]

5 голосов
/ 16 сентября 2011

Count() не существует для IQueryable, но существует для IQueryable<TSource>. За исключением System.Linq.Dynamic, но System.Linq.Dynamic не является частью библиотеки базовых классов, и вам всегда нужно будет добавить ссылку на нее (если вы скомпилировали ее в DLL) или использовать пространство имен (если вы включили Dynamic.cs в вашем проекте). Это не подмножество Linq в BCL. И чтобы подтвердить то, что все заявили, использование пространства имен использует , что только пространство имен (его верхний уровень). Это дизайн языка C # и поддерживается компилятором.

2 голосов
/ 16 сентября 2011

Разве Linq.Dynamic не похож на подмножество Linq? Почему я должен снова добавить его ссылку?

Ну, это все равно, что спрашивать, зачем мне добавлять System.Foo;, если я уже добавляю using System;. В конце концов, Foo также является подмножеством System. Это способ, которым пространства имен работают в C #, вложенные пространства имен не добавляются, когда вы добавляете родительское пространство имен с помощью директивы using.

Вы можете поспорить, что почему шаблон файла кода не добавляется по умолчанию System.Linq.Dynamic. В большинстве случаев это будет не нужно, поскольку System.Linq.Dynamic является специализированным использованием функции Language Integrated Query , которая позволяет создавать динамические запросы.

Что касается ошибки, которую вы получаете, если вы проверите MSDN, IQueryable.Count метод расширения является частью System.Linq, поэтому я не уверен, как добавление System.Linq.Dynamic решило вашу проблему. Метод Queryable.Count (IQueryable)

2 голосов
/ 16 сентября 2011

Мой вопрос: почему используется System.Linq.Dynamic;ссылка не добавляется, если на странице уже используется System.Linq;Разве Linq.Dynamic не похож на подмножество Linq? Почему я должен снова добавить его ссылку?

Именно так в C # вы говорите об использовании, как способ импорта работаетв Яве.В C # нет using System.Linq.*;

Вы уверены, что не используете IQueryable.Count вместо IQueryable.Count()?

0 голосов
/ 16 сентября 2011

Метод count является методом расширения.Для метода расширения требуется, чтобы пространство имен, в котором они определены, было импортировано с using

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...