c# - LINQ 按实体 FieldName.Contains 或按包含的实体 FieldName.Contains 过滤
问题描述
我有两张桌子:TradeItem
和BarCode
。后者存储贸易项目的条形码。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.Name
OR TradeItem.Description
OR 相关BarCode.Name
包含一些字符串,例如“123”,它将返回 TradeItems。可以做一个 LINQ 表达式来过滤TradeItem.Name
OR TradeItem.Description
。可以做一个 LINQ 表达式来过滤 include BarCode.Name
。但我不能把这两个表达式结合起来。我知道 SQL Server 的 VIEW 可以用于此,但我想要一个类型为 的实体TradeItem
,其中包含类型为 BarCode 的实体。任何人都可以帮我解决那个 LINQ 吗?
解决方案
像这样:
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}");
}
}
}
}
推荐阅读
- html - 需要创建此 HTML/CSS 网格布局
- computer-science - 不同级别的缓存之间如何进行块传输
- python - 如何从父子关系模型中获取自身子对象的对象
- conv-neural-network - 如何将巨大的 hdf5 文件上传到谷歌 colab?
- html - 如何使段落适合不同的浏览器宽度
- java - Java 格式负整数
- html - 在导航元素内垂直对齐 div
- swift - Swift for macOS:如何跨窗口控制器调用函数?
- jquery - 截屏并显示在 Angular 1.6 的新弹出窗口/选项卡中
- azure-virtual-machine - 我的 Azure 门户中突然停止了 100 个 Vm