Linq возвращает одно целочисленное значение на основе строки, хранящейся в SQL - PullRequest
3 голосов
/ 20 января 2012

Я совсем новичок в Linq,

Я просто пытаюсь выполнить обычный возврат, который обычно выполняется в SQL и, похоже, не может получить прямой ответ от просмотра многих форумов с часами просмотра.

Хорошо, у меня есть таблица Customers с двумя столбцами, CustomerID и CustomerName, которые принадлежат CustomersDataBase

Я успешно смог вернуть одну строку из целочисленного запроса, используя следующий метод (в его основной форме):

public string getCustomerName(int custID)
{
    CustomerDataBase cdb = new CustomerDataBase();

    string custName = (
        from c in cdb.Customers
        where c.CustomerID == custID
        select c.CustomerName)
        .SingleOrDefault();

    return custName;
}

Хорошо, это нормально, но когда я пытаюсь изменить ситуацию, пытаясь вернуть CustomerID, возвращается Exception: System.InvalidCastException: указанное приведение недопустимо.

Это мой код:

public int getCustomerID(string custName)
{
    CustomerDataBase cdb = new CustomerDataBase();

    int custID = (
        from c in cdb.Customers
        where c.CustomerName == custName
        select c.CustomerID)
        .SingleOrDefault();

    return custID;
}

Я также пытался продумать термины SQL, чтобы сделать строку custName массивом символов:

public int getCustomerID(string custName)
{ 
    CustomerDataBase cdb = new CustomerDataBase();

    int custID = (
        from c in cdb.Customers
        where c.CustomerName == "'"+custName+"'"
        select c.CustomerID)
        .SingleOrDefault();

    return custID;
}

Исключение исчезает, но, похоже, возвращает «0» для CustomerID, хотя у меня есть сотни записей.

Так что в SQL я бы просто использовал следующее:

Select CustomerID 
from   Customers 
where  CustomerName="'"+custName+"'"

Любая помощь будет высоко ценится! Спасибо

// Редактирует код, чтобы он работал (следующий ответ от Джона Скита): -

Хорошо. Это работает:

[Table (Name = "TableCustomers")] Публичный класс {

    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public long CustomerID { get; set; }
    [Column]
    public string CustomerName { get; set; }
    [Column]

} // для размещения BigInt в базе данных SQL

public long getCustomerID (строка custName) {

        CustomerDatabase cdb = new CustomerDatabase();



           long custID = (from c in cdb.Customers

                          where c.CustomerName == custName
                          select c.CustomerID).SingleOrDefault();

        return custID;
    }
}

1 Ответ

4 голосов
/ 20 января 2012

Ваш последний подход определенно неверен - вам не нужно вручную "заключать в кавычки" параметры; в основном вы ищете значение с кавычками , и оно возвращает 0 из SingleOrDefault, потому что оно не нашло запись. (Это то, что делает SingleOrDefault - возвращает значение по умолчанию для типа (int, здесь), если нет результатов.)

Я подозреваю , что ваш столбец CustomerID обнуляем или что-то в этом роде - но трудно сказать, не зная больше о вашей схеме. Вы должны проверить, соответствует ли ваша модель LINQ to SQL схеме вашей базы данных.

Вы должны также подумать, что вы хотите сделать, если есть несколько клиентов с одинаковым именем - в настоящее время это вызовет исключение; это то, что вы хотите?

РЕДАКТИРОВАТЬ: Хорошо, теперь вы наконец-то сказали нам, что схема имеет, это ясно. BigInt - это 64-разрядное целое число, но вы используете 32-разрядное свойство в модели LINQ. Просто измените CustomerID с int на long в вашей модели LINQ, измените свой метод, чтобы он также возвращал long, и все должно быть в порядке.

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