1

我首先将 MVC4 与实体框架代码一起使用。

我有以下型号:

public class Member {

    public int ID { get; set; }

    [Display(Name = "First Name")]
    [Required(ErrorMessage = "Please enter a first name.")]
    public string FirstName { get; set; }

    [Display(Name = "Last Initial")]
    [Required(ErrorMessage = "Please enter the last initial of your last name.")]
    [MaxLength(1)]
    public string LastName { get; set; }

    [Display(Name = "City")]
    [Required(ErrorMessage = "Please enter your city.")]
    public string City { get; set; }

    public virtual ICollection<Favorite> Favorites { get; set; }
}

public class Favorite {
    public int ID { get; set; }
    public String Type { get; set; }
    public String Value { get; set; }
}

我的代码正在List<string> searchTerms从前端接收搜索词列表。我需要为每个搜索词搜索每个成员的收藏夹值。

我正在使用以下 LINQ 语句:

return db.Favorites.Where(f => searchTerms.Any(s => f.Value.Contains(s))).ToList();

我的问题是这将返回一个List<Favorite>很棒但我真正需要的是数据库中关联的成员的 ID。不幸的是,这不是我可以在 LINQ 中选择的选项

return db.Favorites.Where(f => searchTerms.Any(s => f.Value.Contains(s))).Select(f => f.????) .ToList();

这 ???只给我ID, Type, Value. 的属性Favortie,但是在创建的数据库表实体框架中有一个外键列Member_ID。但我不能在 C# 中选择它。

所以我的问题是……我该怎么做?我只是public virtual int MemberID在最喜欢的课程中添加一个吗?实体框架会自动将其与外键关联吗?

4

3 回答 3

3

基于 Code First 约定,只需添加外键:

public int MemberID { get; set; }

如果您需要导航属性,那么

public virtual Member Member { get; set; }

检查此MSDN 页面以获取更多信息

于 2013-10-24T18:28:01.013 回答
1

您可以通过过滤的子集合获取成员集合。

例子:

    return db.Members.Select(member => new
    {
        Member = member,
        Favorites = member.Favorites.Where(f => searchTerms.Any(s => f.Value.Contains(s)))
     }).Where(m => m.Favorites.Any()).ToList();

不要忘记IEqualityComparer, 或将搜索词和值都转换为大写或小写

于 2013-10-24T19:04:42.000 回答
0

这有效:

   return db.Members.Select(member => new
    {
        Member = member,
        Favorites = member.Favorites.Where(f => searchTerms.Any(s => f.Value.Contains(s)))
     }).Where(m => m.Favorites.Any()).ToList();
于 2014-08-16T13:39:00.013 回答