Select 基于 LINQ 的字符串列表的多条记录
Select multiple records based on List of strings with LINQ
我看过类似的问题 - id 不是字符串 - 但它对我不起作用,所以我正在重新posting。
店铺型号:
public class Store
{
public int ID { get; set; }
public virtual IList<Asset> Assets { get; set; }
}
直到:
public class Till
{
public int ID { get; set; }
[ForeignKey("Store")]
public int StoreID { get; set; }
public virtual Store Store { get; set; }
public int Type { get; set; }
public string Kind { get; set; }
public string Name { get; set; }
}
使用 MvcCheckBoxList 参考库我有一个包含名称列表的 FilterViewModel:
public class FilterViewModel
{
public IEnumerable<TillCheckBox> AvailableTills { get; set; }
public IEnumerable<TillCheckBox> SelectedTills { get; set; }
public PostedTills PostedTills { get; set; }
}
public class PostedTills
{
public string[] TillNames { get; set; }
}
FilterViewModel.AvailableTills 使用 Till 类型的所有资产的名称进行初始化(例如 { "Front"、"Back"、"Floor"、"Shop"、 "Cafe"}):
private List<string> GetAllTills()
{
return (from a in _db.Assets where (a.Kind == "Till") select a.Name).Distinct().ToList();
}
FilterViewModel.SelectedTills和FilterViewModel.PostedTills都是空的。尚未选择任何内容。
当视图使用 FilterViewModel 并通过 GET 将选定复选框列表提交回 FilterViewModel 中的控制器时。
我想要做的是获取在 PostedTills 列表中具有名称资产的商店列表。
因此,如果用户选择 "Front" 和 "Cafe",我希望商店的资产名称为 "Front" AND "Cafe".
相反,我得到的是一个商店列表,其中包含名为 "Front" 的资产(但不一定是 "Cafe")和名为 "Cafe" 的资产(但不是 "Front") .
我正在尝试的 Linq 查询(基于其他 post)是:
stores = (from s in db.Stores
join a in db.Assets on s.ID equals a.StoreID
where (a => postedTillNames.Contains(a.Name))
select s).Distinct().ToList();
但这会导致错误 "Cannot convert lambda expression to type 'bool' because it is not a delegate type":
(a => postedTillNames.Contains(a.Name))
我也尝试过不同的查询,但无法获得我想要的结果。
有人能帮忙吗?
问候
克雷格
您只需输入要执行的实际表达式,而不是定义执行方式的 lambda。将 (a => postedTillNames.Contains(a.Name))
替换为 postedTillNames.Contains(a.Name)
.
您在查询表达式的上下文中提供代码这一事实意味着编译器将为您将代码包装在 lambda 中。它将它包装在 lambda 中两次(一次由您,一次由编译器),这就是导致问题的原因。
我看过类似的问题 - id 不是字符串 - 但它对我不起作用,所以我正在重新posting。
店铺型号:
public class Store
{
public int ID { get; set; }
public virtual IList<Asset> Assets { get; set; }
}
直到:
public class Till
{
public int ID { get; set; }
[ForeignKey("Store")]
public int StoreID { get; set; }
public virtual Store Store { get; set; }
public int Type { get; set; }
public string Kind { get; set; }
public string Name { get; set; }
}
使用 MvcCheckBoxList 参考库我有一个包含名称列表的 FilterViewModel:
public class FilterViewModel
{
public IEnumerable<TillCheckBox> AvailableTills { get; set; }
public IEnumerable<TillCheckBox> SelectedTills { get; set; }
public PostedTills PostedTills { get; set; }
}
public class PostedTills
{
public string[] TillNames { get; set; }
}
FilterViewModel.AvailableTills 使用 Till 类型的所有资产的名称进行初始化(例如 { "Front"、"Back"、"Floor"、"Shop"、 "Cafe"}):
private List<string> GetAllTills()
{
return (from a in _db.Assets where (a.Kind == "Till") select a.Name).Distinct().ToList();
}
FilterViewModel.SelectedTills和FilterViewModel.PostedTills都是空的。尚未选择任何内容。
当视图使用 FilterViewModel 并通过 GET 将选定复选框列表提交回 FilterViewModel 中的控制器时。
我想要做的是获取在 PostedTills 列表中具有名称资产的商店列表。
因此,如果用户选择 "Front" 和 "Cafe",我希望商店的资产名称为 "Front" AND "Cafe".
相反,我得到的是一个商店列表,其中包含名为 "Front" 的资产(但不一定是 "Cafe")和名为 "Cafe" 的资产(但不是 "Front") .
我正在尝试的 Linq 查询(基于其他 post)是:
stores = (from s in db.Stores
join a in db.Assets on s.ID equals a.StoreID
where (a => postedTillNames.Contains(a.Name))
select s).Distinct().ToList();
但这会导致错误 "Cannot convert lambda expression to type 'bool' because it is not a delegate type":
(a => postedTillNames.Contains(a.Name))
我也尝试过不同的查询,但无法获得我想要的结果。
有人能帮忙吗?
问候 克雷格
您只需输入要执行的实际表达式,而不是定义执行方式的 lambda。将 (a => postedTillNames.Contains(a.Name))
替换为 postedTillNames.Contains(a.Name)
.
您在查询表达式的上下文中提供代码这一事实意味着编译器将为您将代码包装在 lambda 中。它将它包装在 lambda 中两次(一次由您,一次由编译器),这就是导致问题的原因。