在这个节目中,我有三个型号:Client,BrokerageSubscription.ASubscription将客户与经纪公司联系起来.客户订阅了一家或多家经纪公司.

public class Client
{
  public int Id { get; set; }

  [Required, StringLength(50), DisplayName("Last Name")]
  public string LastName { get; set; }

  [Required, StringLength(50), DisplayName("First Name")]
  public string FirstName { get; set; }

  [DataType(DataType.Date),DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}",ApplyFormatInEditMode = true),Display(Name = "Birth Date")]
  public DateTime BirthDate { get; set; }

  [DisplayName("Full Name")] 
  public string FullName
  {
    get { return LastName + ", " + FirstName; }
  }

  public ICollection<Subscription> Subscriptions { get; set; }
}
public class Brokerage
{
  [DatabaseGenerated(DatabaseGeneratedOption.None), DisplayName("Registration Number"), Required]
  public string Id { get; set; }

  [Required]
  public string Title { get; set; }

  [DataType(DataType.Currency), Column(TypeName="money")]
  public decimal Fee { get; set; }

  public ICollection<Subscription> Subscriptions { get; set; }
}
public class Subscription
{
  public int ClientId { get; set; }
  public string BrokerageId { get; set; }
  public Client Client { get; set; }
  public Brokerage Brokerage { get; set; }
}

现在,我正在try 编写一个LINQ查询,以便用户获得现有经纪公司的列表,并根据用户是否订阅该经纪公司来 Select 订阅或取消订阅该经纪公司.

为此,我有一个ViewModel,其中包含BrokerageID、经纪公司的名称和一个用于表示客户是否为成员的布尔值.使用以下LINQ查询在控制器中创建此ViewModel:

var subscriptions = (
  from b in _context.Brokerages
  join s in _context.Subscriptions on b.Id equals s.BrokerageId
  select new BrokerageSubscriptionsViewModel
  {
    BrokerageId = b.Id,
    Title = b.Title,
    IsMember = s.ClientId == id
  }).ToList();

这是almost美元在工作.

对于订阅了所有券商的用户,预期结果应如下所示:

A1 : {Unsubscribe}
A2 : {Unsubscribe}
A3 : {Unsubscribe}

但我得到的是整个订阅表的结果,

A1 : {Unsubscribe}
A1 : {Subscribe}
A1 : {Subscribe}
A2 : {Unsubscribe}
A2 : {Subscribe}
A2 : {Subscribe}

这是因为它正在从预订表中提取所有行,如果客户端ID不匹配,它将显示"Duplates".我曾try 添加where s.ClientId == id条款,但这使得没有活跃订阅的用户什么都看不到,而他们应该看到订阅任何现有经纪公司的选项.

我已经在这个问题上挣扎了很长一段时间,如果能得到任何帮助,我将不胜感激.

推荐答案

在Linq中,EXISTS的类似功能是.Any().

如果正确定义了关系,则可以使用导航属性.

var subscriptions = (
  from b in _context.Brokerages
  select new BrokerageSubscriptionsViewModel
  {
    BrokerageId = b.Id,
    Title = b.Title,
    IsMember = b.Subscriptions.Any(),
  }).ToList();

否则,使用"子查询"

var subscriptions = (
  from b in _context.Brokerages
  select new BrokerageSubscriptionsViewModel
  {
    BrokerageId = b.Id,
    Title = b.Title,
    IsMember = _context.Subscriptions.Any(s => b.Id == s.BrokerageId),
  }).ToList();

Csharp相关问答推荐

. NET JSON属性自定义所需逻辑

Docker Container中的HttpRequest后地址不可用

使用泛型可空类实现接口

System.Text.Json .NET 8多形态语法化

有没有类似于扩展元素的合并元组的语法?

委托RequestDelegate不带2个参数-ASP.NET Core 8最小API

将操作从编辑页重定向到带参数的索引页

错误CS1061';AuthenticationBuilder';不包含AddOpenIdConnect的定义

为什么我不能从我的异步任务方法中返回异步任务方法?

FakeItEasy自动嘲弄内容

如果所有";async任务方法()";调用都返回Task.FromResult()-是否同步执行?

用于分钟和秒验证的MudTextfield的正则表达式掩码

同时通过多个IEumable<;T&>枚举

为什么我不能在固定语句中使用外部函数?

使用多个身份验证方案时引发NullReferenceException

Dapper出错-无法将对象作为参数传递到Execute方法中

序列化和反序列化ASP.NETCore.NET 6 C#App中的泛型对象

将焦点设置为在离开组合框时变为可见的下一项

如何将典型的C#一行程序作为单独的代码段编写?

在C#中调用HttpResponseMessage,但它退出并使用REST API没有错误