2

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

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 查询进行各种连接,但我还不够聪明。

任何帮助,将不胜感激。

4

3 回答 3

2

您可以使用 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()));
于 2013-01-15T17:25:45.750 回答
1

首先,如果要进行“不区分大小写”的搜索,请更改数据库表列的排序规则。

然后,您的 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));
于 2013-01-15T17:21:33.833 回答
0

尝试使用.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)
于 2013-01-15T17:20:01.600 回答