使用C#中的LINQ进行条件过滤

3

我需要获取一份记录列表并根据条件进行筛选:如果serviceId等于1,则需要将该结果与serviceId等于5的结果合并。

模型:

public class Partner
{
    [Key]
    public int Id { get; set; }
    public DbGeography Location { get; set; }
    public virtual ICollection<PartnerServiceBrand> PartnerServiceBrands { get; set; }
}

public class PartnerServiceBrand
{
    [Key]
    public int Id { get; set; }

    public virtual Partner Partner { get; set; }
    public virtual Service Service { get; set; }
}

public class Service
{
    [Key]
    public int Id { get; set; }
    public virtual ICollection<PartnerServiceBrand> PartnerServiceBrands { get; set; }
}

我为一个过滤器写的代码:

var serviceId = 1;

var partners = dbContext.Partners.Where(p => p.PartnerServiceBrands.Select(psb => psb.Service.Id).Contains(serviceId));

我尝试做:

if (serviceId == 1)
{
    var partners2 = dbContext.Partners.Where(p => p.PartnerServiceBrands.Select(psb => psb.Service.Id).Contains(5));

    partners = partners.Union(partners2);  // Error
}

我还尝试使用Contains和一个List<int>,但是我没有成功运行它。

编辑

我得到的错误是:

异常:“The geography data type cannot be selected as DISTINCT because it is not comparable.” (System.Data.SqlClient.SqlException)


不清楚你想做什么。你在第一个列表中需要什么?你想获取所有具有id = 1的服务的合作伙伴吗? - ataravati
1
你收到了什么错误信息? - Spider man
@ataravati 你好,我想获取所有serviceId=5的合作伙伴和所有serviceId=1的合作伙伴。 - Patrick
@techkid 你好,抱歉我已经编辑了问题并添加了导致错误的缺失属性 (public DbGeography Location { get; set; }) - Patrick
4个回答

1
我来翻译一下:

我对此的看法。

假设您想要过滤的serviceIds列表:

var serviceIds = new List<int>{1, 5};

var partners = dbContext.Services
    .Where(ser => serviceIds.Contains(ser.Id).SelectMany(ser => ser.PartnerServiceBrands)
    .Select(psb => psb.Partner).Distinct();

嗨,我必须在Contains(ser.Id)后面添加“)”以避免红色编辑器下划线,但在执行时,我得到了我在问题中包含的错误。 - Patrick

1
您之所以会遇到错误,是因为Union()SELECT DISTINCT一起生成了UNION ALL。另外,Concat()仅生成UNION ALL

无论如何,我认为您应该能够通过以下方式获得您想要的结果:

var serviceIds = new List<int>{ 1, 5 };
var partners = dbContext.Partners
    .Where(p => p.PartnerServiceBrands.Any(psb => serviceIds.Contains(psb.Service.Id))

0
也许这会奏效:
var partners = dbContext.Services
    .Where(ser => ser.Id == 1 || s.Id == 5).SelectMany(ser => ser.PartnerServiceBrands)
    .Select(psb => psb.Partner).Distinct();

0
假设您有一个名为 ServicesDbSet<Service>,我建议尝试以下代码:
var serviceId = ...;

var partners = dbContext.Services
      .Where(svc => svc.Id == serviceId || (serviceId == 1 && svc.Id == 5))
      .SelectMany(svc => svc.PartnerServiceBrands)
      .Select(psb => psb.Partner).Distinct();

我得到了重复的合作伙伴 :( - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接