Возникли проблемы при передаче объектов между уровнями - PullRequest
0 голосов
/ 23 сентября 2011

Я пытаюсь сделать что-то, что должно быть очень простым, но я получаю ошибки, я не знаю, как исправить. Кроме того, я даже не знаю, правильно ли я поступаю.

У меня есть 3 объекта. Мою первую личность зовут Билл, и она моя главная. Два других - это Повтор и Тип. У Билла есть внешние ключи (то есть TypeId), которые указывают на их соответствующие первичные ключи. Тип и Повторить похожи. У них есть свой идентификатор и описание.

Что я пытаюсь сделать с EF и LINQ to Entity: получить все счета со всеми свойствами Билла, но вместо TypeId я хочу TypeDesc.

Это решение N уровня с 3 проектами Пока что у меня есть уровень данных, который я называю Модель, бизнес-уровень, который я называю BLL, а мою презентацию позже я называю GUI.

namespace BillApp.Model
{
public class BillModel
{
    public List<BillType> GetAllBills()
    {
        using (BillsEntities be = new BillsEntities())
        {
            var results = from o in be.Bills
                         .Include("Type")
                         .Include("Repeat")
                          select new
                          {
                              BillId = o.BillId,
                              Name = o.Name,
                              URL = o.URL,
                              PaymentAmount = o.PaymentAmount,
                              Balance = o.Balance,
                              DueDate = o.DueDate,
                              TypeDesc = o.Type.TypeDesc,
                              RepeatDesc = o.Repeat.RepeatDesc,
                              Username = o.UserName 
                          };

           return results.ToList();
        }
    }
  }
  public class BillType
  {
    #region Properties
    public int BillId { get; set; }
    public string Name { get; set; }
    public string URL { get; set; }
    public decimal PaymentAmount { get; set; }
    public decimal Balance { get; set; }
    public DateTime DueDate { get; set; }
    public string TypeDesc { get; set; }
    public string RepeatDesc { get; set; }
    public string Username { get; set; }
    #endregion
  }    
}

results возвращает ошибку Не удается неявно преобразовать тип System.Linq.IQueryable<AnonymousType#1> в System.Collections.Generic.List<BillApp.Model.BillType>

Затем я пытаюсь передать объект в BLL с этим кодом.

namespace BillApp.BLL
{
public class BillBLL
{
    public List<BillType> GetAllBills()
    {
        BillModel b = new BillModel();

        return b.GetAllBills();
    }
}
}

Но в BillType есть ошибка: не удалось найти тип или имя пространства имен 'BillType' (отсутствует директива using или ссылка на сборку?)

Что мне не хватает? Что я могу сделать лучше?

1 Ответ

3 голосов
/ 24 сентября 2011

Я думаю, что сообщения об ошибках довольно ясны: results имеет тип IQueryable<T>, и вы пытаетесь вернуть List<T>. Чтобы вернуть список, вы можете использовать метод ToList. Вам также нужно будет создать экземпляры BillType вместо анонимных объектов, чтобы они соответствовали типу возврата List<BillType>. Ваш GetAllBills метод будет выглядеть так:

public List<BillType> GetAllBills()
{
    using (BillsEntities be = new BillsEntities())
    {
        var results = from o in be.Bills
                     .Include("Type")
                     .Include("Repeat")
                      select new BillType
                      {
                          BillId = o.BillId,
                          Name = o.Name,
                          URL = o.URL,
                          PaymentAmount = o.PaymentAmount,
                          Balance = o.Balance,
                          DueDate = o.DueDate,
                          TypeDesc = o.Type.TypeDesc,
                          RepeatDesc = o.Repeat.RepeatDesc,
                          Username = o.UserName 
                      };

       return results.ToList();
    }
}

Для второй ошибки вы, вероятно, просто пропускаете директиву using, чтобы иметь доступ к вашему типу BillType, который находится в другом пространстве имен. У вас будет эта строка вверху файла:

using BillApp.Model;
...