首页 > 解决方案 > LINQ 按实体 FieldName.Contains 或按包含的实体 FieldName.Contains 过滤

问题描述

我有两张桌子:TradeItemBarCode。后者存储贸易项目的条形码。TradeItem 可以有任何(或没有)数量的条码。

[Table("BarCode")]
public partial class BarCode
{
    [Key]
    public Guid PK { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    public Guid FK_TradeItem { get; set; }
    public virtual TradeItem TradeItem { get; set; }
}

[Table("TradeItem")]
public partial class TradeItem
{
    public TradeItem()
    {
        BarCodes = new HashSet<BarCode>();
    }

    [Key]
    public Guid PK { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }

    public string Description { get; set; }
    public virtual ICollection<BarCode> BarCodes { get; set; }
}

public partial class SOModel : DbContext
{
    public SOModel(): base("name=SOContext")
    {
    }

    public virtual DbSet<BarCode> BarCodes { get; set; }
    public virtual DbSet<TradeItem> TradeItems { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TradeItem>()
            .HasMany(e => e.BarCodes)
            .WithRequired(e => e.TradeItem)
            .HasForeignKey(e => e.FK_TradeItem)
            .WillCascadeOnDelete(false);
    }
}

使用EntityFramework,我想要一个 LINQ 表达式,如果TradeItem.NameOR TradeItem.DescriptionOR 相关BarCode.Name包含一些字符串,例如“123”,它将返回 TradeItems。可以做一个 LINQ 表达式来过滤TradeItem.NameOR TradeItem.Description。可以做一个 LINQ 表达式来过滤 include BarCode.Name。但我不能把这两个表达式结合起来。我知道 SQL Server 的 VIEW 可以用于此,但我想要一个类型为 的实体TradeItem,其中包含类型为 BarCode 的实体。任何人都可以帮我解决那个 LINQ 吗?

标签: c#entity-frameworklinq

解决方案


像这样:

public class AppDbContext: DbContext
{
    public AppDbContext(): base("DefaultConnection")
    {   }
    public DbSet<TradeItem> TradeItems { get; set; }
}

public class TradeItem
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Decription { get; set; }
    public virtual ICollection<BarCode> BarCodes { get; } = new List<BarCode>();
}

public class BarCode
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        using (var ctx = new AppDbContext() )
        {
            string test="123";

        var tradeItems =
            ctx.TradeItems
                .Where((ti) => ti.Name.Contains(test) || ti.Decription.Contains(test) || ti.BarCodes.Any((bc) => bc.Name.Contains(test)))
            .ToList();

        foreach (var ti in tradeItems)
        {
            Console.WriteLine($"{ti.Id} : {ti.Name} : {ti.Decription}");
            foreach (var bc in ti.BarCodes)
                Console.WriteLine($"\t{bc.Id} : {bc.Name}");
        }
    }
}
}

推荐阅读