为什么EF代码没有选择单个列?

时间:2019-04-02 08:43:45

标签: c# asp.net-mvc entity-framework

我已经使用它从集合中只选择了一个列,但是没有,并且抛出了转换错误。

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 个答案:

答案 0 :(得分:1)

正如DevilSuichiro在评论中说的那样,您不应强制转换为IEnumerable<T>,而只需调用.AsEnumerable()即可,这样会保持惰性。

但是在您的情况下,您似乎根本不需要这样做,因为FirstFirstOrDefault也可以与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;