使用LINQ从一对多关系访问外键

时间:2013-10-24 18:22:25

标签: linq entity-framework asp.net-mvc-4

我首先使用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();

???只给我IDTypeValueFavortie的属性,但是在数据库表Entity框架中创建了一个外键列Member_ID。但我不能在C#中选择它。

所以我的问题是......我该怎么办?我只是在Favorite类中添加public virtual int MemberID吗?实体框架会自动将其与外键相关联吗?

3 个答案:

答案 0 :(得分:3)

基于Code First约定,仅用于添加外键:

public int MemberID { get; set; }

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

public virtual Member Member { get; set; }

查看此MSDN page以获取更多信息

答案 1 :(得分: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,或将搜索字词和值转换为大写或小写

答案 2 :(得分: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();