我正在使用 Linq to Entities 并添加了 using System.Linq.Dynamic;
的 using stmt
我的目标是将 whereClause
变量传递到 emailList 查询中(参见屏幕截图)。
有什么想法吗?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在使用了@Michael 的建议后,我得到了它的工作原理:
HTML(注意我将字段值放在“值”属性中):
<asp:CheckBoxList ID="_checkboxGroups" runat="Server">
<asp:ListItem Text="Sid Dickens Lovers" Value="SidDickens_TF" Selected="False" />
<asp:ListItem Text="Rosamond Lover" Value="Rosamond_TF" Selected="false" />
<asp:ListItem Text="Wine and Cheese Lovers" Value="WineAndCheese_TF" Selected="false" />
<asp:ListItem Text="Good Clients" Value="IntDesign_TF" Selected="false" />
<asp:ListItem Text="Vendors" Value="Vendor_TF" Selected="false" />
</asp:CheckBoxList>
代码隐藏:
// determine # of items in asp:CheckBoxList
var groupCount = _checkboxGroups.Items.Count;
var conditions = new List<string>();
for (int i = 0; i < groupCount; i++)
{
if (_checkboxGroups.Items[i].Selected)
{
conditions.Add(_checkboxGroups.Items[i].Value.ToString() + " == true");
}
}
string whereClause = string.Join(" OR ", conditions.ToArray());
ElanEntities3 db = new ElanEntities3();
var emailList = (from c in db.vEmailListViewforSendings
orderby c.Email
select c).AsQueryable();
emailList = emailList.Where(whereClause);
_listViewClients.DataSource = emailList;
最佳答案
您需要将与参数匹配的对象传递给IQueryable.Where( predicate )
所以 whereClause
必须是这种类型的对象:
Expression<Func<TSource, bool>>
因为您对 where 子句进行 OR 运算而不是对它们进行 AND 运算,所以您将不得不构建一个大的 where 子句。
假设您的数据对象是 OBJ 类型并且它具有 bool 属性 P0 和 P1:
bool filterP0 = _checkboxGroups[0].Selected;
bool filterP1 = _checkboxGroups[1].Selected;
Expression<Func<OBJ, bool>> predicate = o =>
(
( !filterP0 && !filterP1 )
||
( filterP0 && o.P0 )
||
( filterP1 && o.P1 )
);
var emailList =
db.vEmailListViewForSendings
.Where( predicate )
.OrderBy( o => o.ID );
无论如何,这就是要点。
或者,如果您真的必须动态构建谓词,您可以使用 Joe Albahari's Predicate Builder .
关于c# - 在动态 linq 查询中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10396960/