【问题标题】:LINQ query help: searching for data in a Many to Many using Entity FrameworkLINQ 查询帮助:使用实体框架在多对多中搜索数据
【发布时间】:2013-01-15 17:07:51
【问题描述】:

我已经四处寻找并看到了一堆类似的问题,但我仍然无法弄清楚这一点。我有两个类资产和标签。以下是它们的定义:

public class Asset
{
    [Key]
    public int AssetID { get; set; }

    public decimal? Height { get; set; }
    public decimal? Width { get; set; }
    public decimal? Depth { get; set; }
    public decimal? Radius { get; set; }
    public string Name { get; set; }

    [Display(Name = "Manufacturer")]
    public int ManufacturerID { get; set; }

    [Display(Name = "Type")]
    public int PackageTypeID { get; set; }

    public virtual Manufacturer Manufacturer { get; set; }
    public virtual PackageType PackageType { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }

}

public class Tag
{
    public int TagID { get; set; }
    public string Key { get; set; }
    public string Value { get; set; }
    public virtual ICollection<Asset> Assets { get; set; }

}

我的资产索引页面上有一个搜索框,我希望能够搜索 Asset.Name、Manufacturer.Name、Asset.Tag.Key 和 Asset.Tag.Value。这是我到目前为止所得到的。

var assets = from a in db.Assets                        
                     select a;
if (!String.IsNullOrEmpty(searchString))
        {
assets = assets.Where(a => a.Name.ToUpper().Contains(searchString.ToUpper())
          || a.Manufacturer.Name.ToUpper().Contains(searchString.ToUpper()));
}

现在,我不知道如何访问/搜索 Tag.Key 或 Tag.Value。我已经尝试过使用 LINQ 查询进行各种连接,但我还不够聪明。

任何帮助将不胜感激。

【问题讨论】:

    标签: .net asp.net-mvc-3 linq entity-framework lambda


    【解决方案1】:

    您可以使用 Any 来检查标签并按 searchString 过滤

    var result = db.Assets.Where(a => a.Name.ToUpper().Contains(searchString.ToUpper()) ||
                                      a.Manufacturer.Name.ToUpper().Contains(searchString.ToUpper()) ||                       
                                      a.Tags.Any(t => t.Key.ToUpper().Contains(searchString.ToUpper()) || t.Value.ToUpper().Contains(searchString.ToUpper()));
    

    【讨论】:

    • 修正,误解了问题。
    • 就是这样。非常感谢!我欠你一杯啤酒。
    【解决方案2】:

    首先,如果您想让搜索“不区分大小写”,请更改数据库表列的collation

    然后,您的 LINQ 代码:

    var assets = db.Assets.Where(a => a.Name.Contains(searchString)
          || a.Manufacturer.Name.Contains(searchString)
          || a.Tags.Any(t => t.Key == searchString || t.Value == searchString));
    

    【讨论】:

    • 感谢您让我了解排序规则。
    【解决方案3】:

    尝试使用.Any() 扩展方法来查找资产是否包含带有已定义搜索词的标签

    var result = db.Assets.Where(a => a.Name.ToUpper().Contains(searchString.ToUpper())
                                   || a.Manufacturer.Name.ToUpper().Contains(searchString.ToUpper()
                                   || a.Tags.Any(t => t.Key == searchString)
                                   || a.Tags.Any(t => t.Value == searchString)
    

    【讨论】:

      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多