如果我使用普通的SQL
,这就是我要做的用户选择“全部”
SELECT COLUMN FROM TABLE WHERE NAME LIKE '%'
用户选择的特定名称
SELECT COLUMN FROM TABLE WHERE NAME LIKE 'John'
在EF中,类似查询的最接近的翻译似乎是包含的。所以我做了这样的事情:
string comboboxValue = getComboboxValue(); //Empty if all selected
from tb in _dbContext.TABLE
where tb.NAME.Contains(comboboxValue)
select COLUMN
哪种方法适用于检索所有内容。但是,使用Contains意味着上述内容将匹配“Johnathan”,而不仅仅是“John”
有没有办法获得所需的完全相同的行为?
答案 0 :(得分:2)
类似查询使用%
作为通配符。因此,虽然您永远不想搜索WHERE NAME LIKE '%'
(因为这只会返回所有内容),但您可以使用%
来搜索模式:
Where Name like 'John%'
匹配名称的所有行'John'Where Name like '%john'
匹配Name 以'John'Where Name like '%john%'
匹配名称在列使用Entity Framework,您可以匹配以下不同的搜索类型:
.Where(x => x.Name.StartsWith("John"));
.Where(x => x.Name.EndsWith("John"));
.Where(x => x.Name.Contains("John"));
.Where(x => x.Name == "John");
在原始的sql中,当您不使用通配符时,您可能希望避免使用Like
。如果要匹配精确值,请使用=
。如果您不想过滤,那么就不要包含where
子句。
根据您的具体情况,您可能希望查看comboBox的值,并相应地继续:
string comboboxValue = getComboboxValue(); //Empty if all selected
var isAll = string.IsNullOrEmpty(comboboxValue)
return _dbContext.Table.Where(x => isAll || x.Name == comboBoxValue).Select(x => x.COLUMN);
看起来您不需要使用Contains
或您引用的任何其他通配符搜索。
答案 1 :(得分:0)
您可以使用某些信号变量来选择
之类的方式
bool matchExact = false;
...
where tb.NAME == ( matchExact ? comboboxValue : tb.NAME )
...
心灵无效但