csrss Ответов: 0

Проблемы с select в LINQ2SQL


Здравствуйте, друзья! Вот мои сущности:
public class Subscription
{
    [Key]
    public int id { get; set; }

    public string name { get; set; }
    public double data { get; set; }
}

public class SubscriptionData
{
    [Key]
    public int id { get; set; }

    [ForeignKey("subscription")]
    public int subscriptionId { get; set; }
    public virtual Subscription subscription { get; set; }

    [ForeignKey("company")]
    public int companyId { get; set; }
    public virtual Company company { get; set; }

    public double price { get; set; }
}

public class Company
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public ICollection<Client> clients { get; set; }
    public ICollection< SubscriptionData > subscriptions { get; set; }
}

public class Client
{
    [Key]
    public int id { get; set; }


    [ForeignKey("company")]
    public int companyId { get; set; }
    public virtual Company company { get; set; }

    [ForeignKey("subscription")]
    public int? subscriptionId { get; set; }
    public virtual Subscription subscription { get; set; }
    public string name { get; set; }
}


Так и есть.
SubscriptionData
обертка, потому что каждая компания может иметь несколько цен на одну и ту же подписку.
Теперь я пытаюсь просто вернуть список клиентов с некоторыми вычисленными значениями.
У меня он такой:

Что я уже пробовал:

Я начинаю с IQueryable<company> companies, это возвращается репозиторием, а затем делаю это:
companies
.Include(company => company.clients).ThenInclude(client => client.subscription)
.Include(company => company.clients).ThenInclude(client => client.company).ThenInclude(company => company.subscriptions).ThenInclude(data => data.subscription)
.Include(company => company.subscriptions).ThenInclude(data => data.subscription)
.Select(company => company.clients
    .Select(client => new 
    {
    proposedSubscription = client.company.subscriptions.FirstOrDefault(data => data.subscription.data < client.subscription.data)
    }))


Поэтому я хочу вернуть всех клиентов с новой предлагаемой подпиской, которая имеет меньше данных, чем подписка текущего клиента. У меня есть одна компания, и эта компания имеет 194 пользователя. Это условие:
proposedSubscription = client.company.subscriptions.FirstOrDefault(data => data.subscription.data < client.subscription.data)

выполняется для 4-х клиентов.
Но вместо того, чтобы получить 194 клиента с 4 предлагаемыми подписками, а остальные-с предлагаемыми подписками, установленными в null, я получаю только 4 возвращенных клиента.
Если я изменю условие на:
proposedSubscription = client.company.subscriptions.FirstOrDefault(data => data.subscription.data < 10000)

Затем я получаю 194 клиента, 4 с предлагаемым объектом подписки и остальные с предлагаемым объектом подписки, установленным в null.
Я не понимаю такого поведения LINQ 2 SQL.
Может ли кто - нибудь объяснить, что я делаю не так?

Gerry Schmitz

Почему бы вам не "показать" то, что находится в клиенте.подписка.данные вместо того, чтобы просто заменить их на 10000, а затем задаться вопросом "почему"?

csrss

Все объекты действительны, ни один из них не является нулем. Но мне кажется, что эта строка в sql просто тупая. Потому что даже простой SelectMany терпит неудачу, но нет нулей.

0 Ответов