Почему код EF не выбирает один столбец? - PullRequest
1 голос
/ 02 апреля 2019

Я использовал это, чтобы выбрать только один столбец из коллекции, но это не так и выдает ошибку приведения.

ClientsDAL ClientsDAL = new DAL.ClientsDAL();
var clientsCollection= ClientsDAL.GetClientsCollection();
var projectNum = clientsCollection.Where(p => p.ID == edit.Clients_ID).Select(p => p.ProjectNo).ToString();

Метод:

public IEnumerable<Clients> GetClientsCollection(string name = "")
{
    IEnumerable<Clients> ClientsCollection;
    var query = uow.ClientsRepository.GetQueryable().AsQueryable();
    if (!string.IsNullOrEmpty(name))
    {
        query = query.Where(x => x.Name.Contains(name));
    }

    ClientsCollection = (IEnumerable<Clients>)query;
    return ClientsCollection;
}

1 Ответ

1 голос
/ 02 апреля 2019

Как сказал DevilSuichiro в комментариях, вы не должны бросать на IEnumerable<T>, просто позвоните .AsEnumerable(), это сохранит лень.

Но в вашем случае, похоже, вам это вообще не нужно, потому что First или FirstOrDefault работают и с IQueryable.

Чтобы получить одно поле, используйте этот код

clientsCollection
  .Where(p => p.ID == edit.Clients_ID)
  .Select(p => p.ProjectNo)
  .First() // if you sure that at least one item exists

Или (более безопасно)

var projectNum = clientsCollection
  .Where(p => p.ID == edit.Clients_ID)
  .Select(p => (int?)p.ProjectNo)
  .FirstOrDefault();

if (projectNum != null)
{
    // you find that number
}
else
{
    // there is no item with such edit.Clients_ID
}

Или еще проще с нулевым распространением

var projectNum = clientsCollection
  .FirstOrDefault(p => p.ID == edit.Clients_ID)?.ProjectNo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...