2

私はいろいろ調べて、同様の質問をたくさん見ましたが、まだこれを理解できません。Assets と Tags の 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 Index ページに検索ボックスがあり、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 に答える