Linq Query продовжує підкидати "Неможливо створити постійне значення типу System.Object ...", чому?


94

Нижче наведено зразок коду:

private void loadCustomer(int custIdToQuery) 
    {
        var dbContext = new SampleDB();
        try
        {
            var customerContext = from t in dbContext.tblCustomers      // keeps throwing:
                                   where t.CustID.Equals(custIdToQuery) // Unable to create a constant value of type 'System.Object'. 
                                   select new                           // Only primitive types ('such as Int32, String, and Guid') 
                                   {                                    // are supported in this context.
                                       branchId = t.CustomerBranchID,   //
                                       branchName = t.BranchName        //
                                   };                                   //

            if (customerContext.ToList().Count() < 1) //Already Tried customerContext.Any()
            {
                lstbCustomers.DataSource = customerContext;
                lstbCustomers.DisplayMember = "branchName";
                lstbCustomers.ValueMember = "branchId";
            }
            else
            {
                lstbCustomers.Items.Add("There are no branches defined for the selected customer.");
                lstbCustomers.Refresh();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            dbContext.Dispose();
        }
    }

я не можу зрозуміти, що я роблю не так. Я постійно отримую повідомлення "Неможливо створити константне значення типу" System.Object ". У цьому контексті підтримуються лише примітивні типи (" такі як Int32, String та Guid ")."

Відповіді:


232

Використовуйте == замість дорівнює:

where t.CustID == custIdToQuery

Якщо типи неправильні, ви можете виявити, що це не компілюється.


10
Чи можете ви поясніть різницю між "t.CustID == custIdToQuery" та "t.CustID.Equals (custIdToQuery)". заздалегідь дякую
Ніл

2
@Neel Погляньте на це питання, щоб пояснити різницю між ==і .Equals(): stackoverflow.com/questions/814878/…
Алекс

Логіка рішення 2011 року працювала у 2018 році! Awesome Worthful!
Ієшвант Мудхолкар

29

У мене була така сама проблема з нульовим int. Використання == замість цього працює добре, але якщо ви хочете використовувати .Equals, ви можете порівняти це зі значенням змінної, що допускає нуль, тому

where t.CustID.Value.Equals(custIdToQuery)

9

У мене була та ж проблема, коли я намагався зробити .Equals з нульовим десятковим числом. Використання == замість цього працює добре. Я думаю, це тому, що він не намагається зіставити точний "тип" десяткової коми? до десяткової.


4
Майте на увазі, що це в контексті IQueryable, тому він не компілюється у звичайний код C #. Це стає виразом, який передається постачальнику запитів. Цей провайдер запит може робити все , що хоче із запитом, і він може обробляти Equalsі ==те ж чи ні.
Сервіс

Я використовував .Equal()для порівняння Int32?з Int32. Оскільки Int32?повинен містити Int32і null, я думав, це спрацює. Але цього не сталося. ==працював.
матриця

1

Я зіткнувся з тією ж проблемою, і я порівнював об'єкт збору "User"з цілим числом типу даних "userid"( x.User.Equals(userid))

from user in myshop.UserPermissions.Where(x => x.IsDeleted == false && x.User.Equals(userid))

і правильний Запит є x.UserId.Equals(userid)

from user in myshop.UserPermissions.Where(x => x.IsDeleted == false && x.UserId.Equals(userid))

Це інша проблема, ви порівнюєте яблука та апельсини.
Лассе В. Карлсен,

як це по-іншому. в той час як я стикався з такою ж проблемою. я просто розміщую цю відповідь для довідки лише для інших.
Сатіш Кумар Сонкер

0

У моєму випадку я змінив прямий виклик (sender as Button).Textна непрямий виклик, використовуючи тимчасову змінну, спрацював. робочий код:

private void onTopAccBtnClick(object sender, EventArgs e)
    {
        var name = (sender as Button).Text;
        accountBindingSource.Position =
                    accountBindingSource.IndexOf(_dataService.Db.Accounts.First(ac => ac.AccountName == name));
        accountBindingSource_CurrentChanged(sender, e);
    }

баггі-код:

private void onTopAccBtnClick(object sender, EventArgs e)
    {
        accountBindingSource.Position =
                    accountBindingSource.IndexOf(_dataService.Db.Accounts.First(ac => ac.AccountName == (sender as Button).Text));
        accountBindingSource_CurrentChanged(sender, e);
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.