如何解决Linq其中条款“与”或“或”
只要我有这段代码,就想知道如何使用Linq。
private IQueryable<viewTable> BaseQuery(Models.TestDataContext db)
{
IQueryable<viewTable> query = db.viewTables;
foreach (string row in gridCompany.GridView.GetSelectedFieldValues("CompanyCode"))
query = query.Where(t => t.Comp_Code == row.ToString());
return query;
}
此代码返回查询
SELECT [t0].[Column]
FROM [dbo].[viewTable] AS [t0]
WHERE ([t0].[CompanyCode] = 'ALPHA') **AND** ([t0].[CompanyCode] = 'BETA')
ORDER BY [t0].[EditDate] DESC
如何实现查询结果
SELECT [t0].[Column]
FROM [dbo].[viewTable] AS [t0]
WHERE ([t0].[CompanyCode] = 'ALPHA') **OR** ([t0].[CompanyCode] = 'BETA')
ORDER BY [t0].[EditDate] DESC
谢谢。
解决方法
如果我正确理解了您的要求,那么您想使用IN clause而不是OR
运算符
SELECT [t0].[Column]
FROM [dbo].[viewTable] AS [t0]
WHERE ([t0].[CompanyCode] IN ('ALPHA','BETA')
ORDER BY [t0].[EditDate] DESC
这可以通过以下Linq2Entities查询来实现:
(我假设您正在使用ASPxGridView。)
private IQueryable<viewTable> BaseQuery(Models.TestDataContext db)
{
var companyCodes = gridCompany.GridView.GetSelectedFieldValues("CompanyCode")
.Select(row => row.ToString())
.ToList();
return db.viewTables.Where(t => companyCodes.Contains(t.Comp_Code));
}
,
使用LINQKit,您可以创建扩展方法,以对作为LINQ到数据库的过滤器的集合进行常规测试:
public static class LinqKitExt { // using LINQKit
#region Predicates
// searchTerms - IEnumerable<TSearch> where one must match for a row
// testFne(row,searchTerm) - test one of searchTerms against a row
// r => searchTerms.All(s => testFne(r,s))
public static Expression<Func<T,bool>> AnyIs<T,TSearch>(this IEnumerable<TSearch> searchTerms,Expression<Func<T,TSearch,bool>> testFne) {
var pred = PredicateBuilder.New<T>();
foreach (var s in searchTerms)
pred = pred.Or(r => testFne.Invoke(r,s));
return (Expression<Func<T,bool>>)pred.Expand();
}
#endregion
#region Filters
#region row matches any of searchTerms
// searchTerms - IEnumerable<TSearch> where one must match for a row
// testFne(row,searchTerm) - test one of searchTerms against a row
// dbq.Where(r => searchTerms.Any(s => testFne(r,s)))
public static IQueryable<T> WhereAny<T,TSearch>(this IQueryable<T> dbq,IEnumerable<TSearch> searchTerms,bool>> testFne) =>
dbq.Where(searchTerms.AnyIs(testFne));
public static IQueryable<T> WhereAny<T,bool>> testFne,IEnumerable<TSearch> searchTerms) =>
dbq.Where(searchTerms.AnyIs(testFne));
public static IQueryable<T> WhereAny<T,params TSearch[] searchTerms) =>
dbq.Where(searchTerms.AnyIs(testFne));
#endregion
#endregion
}
当然,AllAre
/ SplitContains
/ WhereAll
/ WhereSplitContains
等都有相应的自然方法。
有了这些扩展名,您的查询将变为:
IQueryable<viewTable> query = db.viewTables.WhereAny(gridCompany.GridView.GetSelectedFieldValues("CompanyCode"),(v,s) => v == s);
注意:对于Contains
有效的情况,这可能是一个更好的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。