在Linq中是否有一个方法可用于构建SQL字符串,如"... where(a = 1)OR(a = 2)"?
我正在创建一个创建一个搜索数据库的应用程序,并允许用户动态添加任何标准(大约50种可能),非常类似于以下SO问题:使用实体框架创建动态查询.我目前正在进行搜索,检查每个条件,如果它不是空白,则将其添加到查询中.
C#
var query = Db.Names.AsQueryable();
if (!string.IsNullOrWhiteSpace(first))
query = query.Where(q => q.first.Contains(first));
if (!string.IsNullOrWhiteSpace(last))
query = query.Where(q => q.last.Contains(last));
//.. around 50 additional criteria
return query.ToList();
Run Code Online (Sandbox Code Playgroud)
此代码在sql server中生成类似于以下内容的东西(为了便于理解,我进行了简化)
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
AND [LastName] LIKE '%last%'
Run Code Online (Sandbox Code Playgroud)
我现在尝试添加一种方法,通过实体框架使用C#生成以下SQL,但使用OR而不是AND,同时仍然保持动态添加条件的能力.
SQL
SELECT
[Id],
[FirstName],
[LastName],
...etc
FROM [dbo].[Names]
WHERE [FirstName] LIKE '%first%'
OR [LastName] LIKE '%last%' <-- NOTICE THE "OR"
Run Code Online (Sandbox Code Playgroud)
通常,条件不会大于查询的两个或三个项目,但将它们组合成一个巨大的查询不是一种选择.我尝试过concat,union和intersect,他们只是复制查询并将它们与UNION连接起来.
是否有一种简单而干净的方法可以使用实体框架向动态生成的查询添加"OR"条件?
使用我的解决方案进行编辑 - 2015年9月29日
自发布以来,我注意到这已经得到了一点关注,所以我决定发布我的解决方案
// Make …Run Code Online (Sandbox Code Playgroud) 在这里的帖子中,我学习了如何使用Linq的延迟执行来构建动态查询.但查询实际上是使用WHERE条件的AND连接.
如何使用OR逻辑实现相同的查询?
由于Flags枚举,查询应搜索Username,WindowsUsername或两者:
public User GetUser(IdentifierType type, string identifier)
{
using (var context = contextFactory.Invoke())
{
var query = from u in context.Users select u;
if (type.HasFlag(IdentifierType.Username))
query = query.Where(u => u.Username == identifier);
if (type.HasFlag(IdentifierType.Windows))
query = query.Where(u => u.WindowsUsername == identifier);
return query.FirstOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud)