我首先使用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
的属性,但是在数据库表Entity框架中创建了一个外键列Member_ID
。但我不能在C#中选择它。
所以我的问题是......我该怎么办?我只是在Favorite类中添加public virtual int MemberID
吗?实体框架会自动将其与外键相关联吗?
答案 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();