从输入值对列表构建 Entity Framework 查询以形成 OR 子句
Build Entity Framework query from a list of input value pairs to form OR clauses
我有一个 ListItem
个对象的列表:
var items = new List<ListItem>
{
new ListItem{ Code = "X", Type = ItemTypes.Type1},
new ListItem{ Code = "Y", Type = ItemTypes.Type1},
new ListItem{ Code = "Z", Type = ItemTypes.Type2},
new ListItem{ Code = "Z", Type = ItemTypes.Type2},
};
我有一个 table(EF 模型)TableItem
个对象:
public class TableItem
{
public int Id { get; set; }
public bool Active { get; set; } = true;
public ItemTypes Type { get; set; }
public string Code { get; set; }
...
}
我的问题是如何使用 Entity Framework 查询列表项中与相同 code/type 匹配的所有 TableItem
记录,例如
SELECT *
FROM TableItems
WHERE
(Type = items[0].Type AND Code = items[0].Code AND Active=true) OR
(Type = items[1].Type AND Code = items[1].Code AND Active=true) OR
...
可能只是帮助
var listCodes = items.Select(x => x.Code).ToList();
var listTypes = items.Select(x => x.Type).ToList();
var result = DbContext.TableItems.Where(x => listCodes.Contains(x.Code) && listType.Contains(x.Type) && x.Active == true);
使用表达式:
Expression<Func<TableItem, bool>> query = de => false;
foreach (var item in items)
{
Expression<Func<TableItem, bool>> exp = de => de.Code == item.Code && de.Type == item.Type && de.Active == true;
query = Expression.Lambda<Func<TableItem, bool>>(
Expression.OrElse(query.Body,
Expression.Invoke(exp, query.Parameters.Cast<Expression>())), query.Parameters);
}
var res = await applicationDbContext.TableItems.Where(query).ToListAsync();
Predicate Builder。
link 有一个很好的扩展,您可以使用它来代替输入上面的代码。
我有一个 ListItem
个对象的列表:
var items = new List<ListItem>
{
new ListItem{ Code = "X", Type = ItemTypes.Type1},
new ListItem{ Code = "Y", Type = ItemTypes.Type1},
new ListItem{ Code = "Z", Type = ItemTypes.Type2},
new ListItem{ Code = "Z", Type = ItemTypes.Type2},
};
我有一个 table(EF 模型)TableItem
个对象:
public class TableItem
{
public int Id { get; set; }
public bool Active { get; set; } = true;
public ItemTypes Type { get; set; }
public string Code { get; set; }
...
}
我的问题是如何使用 Entity Framework 查询列表项中与相同 code/type 匹配的所有 TableItem
记录,例如
SELECT *
FROM TableItems
WHERE
(Type = items[0].Type AND Code = items[0].Code AND Active=true) OR
(Type = items[1].Type AND Code = items[1].Code AND Active=true) OR
...
可能只是帮助
var listCodes = items.Select(x => x.Code).ToList();
var listTypes = items.Select(x => x.Type).ToList();
var result = DbContext.TableItems.Where(x => listCodes.Contains(x.Code) && listType.Contains(x.Type) && x.Active == true);
使用表达式:
Expression<Func<TableItem, bool>> query = de => false;
foreach (var item in items)
{
Expression<Func<TableItem, bool>> exp = de => de.Code == item.Code && de.Type == item.Type && de.Active == true;
query = Expression.Lambda<Func<TableItem, bool>>(
Expression.OrElse(query.Body,
Expression.Invoke(exp, query.Parameters.Cast<Expression>())), query.Parameters);
}
var res = await applicationDbContext.TableItems.Where(query).ToListAsync();
Predicate Builder。 link 有一个很好的扩展,您可以使用它来代替输入上面的代码。