C# 对于select-from-where LINQ,有没有更短的解决方案?
我有搜索功能。我想在我的Book表中选择包含C# 对于select-from-where LINQ,有没有更短的解决方案?,c#,linq,windows-phone,C#,Linq,Windows Phone,我有搜索功能。我想在我的Book表中选择包含\u searchdata的所有值,但我不知道如何用短代码表示“where”,而不是像这样列出表中的所有项目: (我只是得到一些项目,例如,它包含大约100个项目,如书名,作者,流派…我不想指定它,因为它太长了) public void SearchAny(字符串\u searchdata) { var searchAnyInDB=来自BookDB.Books中的Book x 其中(x.BookTitle.Contains(_searchdata) |
\u searchdata
的所有值,但我不知道如何用短代码表示“where”,而不是像这样列出表中的所有项目:
(我只是得到一些项目,例如,它包含大约100个项目,如书名
,作者
,流派
…我不想指定它,因为它太长了)
public void SearchAny(字符串\u searchdata)
{
var searchAnyInDB=来自BookDB.Books中的Book x
其中(x.BookTitle.Contains(_searchdata)
||x.Author.Contains(\u searchdata)
||包含(_searchdata))
选择x;
DataSearch.Clear();
DataSearch=新的ObservableCollection(searchAnyInDB);
}
因为LINQ to Entities和LINQ to SQL都使用表达式作为IQueryable。在扩展方法参数中,您可以在编译类型期间使用反射创建该表达式,并生成所有|
,而不是将它们键入源代码中
大概是这样的:
var searchAnyInDB = from Book x in BookDB.Books
where (GetWhereExpression<Book>(_searchdata))
select x;
var searchAnyInDB=来自BookDB.Books中的Book x
其中(getWhere表达式(_searchdata))
选择x;
和GetWhereExpression
方法:
static Expression<Func<TSource, bool>> GetWhereExpression<TSource>(string value)
{
var param = Expression.Parameter(typeof(TSource));
var val = Expression.Constant(value);
var expression = Expression.Equal(Expression.Constant(1), Expression.Constant(1));
foreach(var prop in typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if(prop.PropertyType == typeof(string))
{
expression = Expression.OrElse(expression,
Expression.Call(
Expression.Property(param, prop),
"Contains",
null,
val
)
);
}
}
return Expression.Lambda<Func<TSource, bool>>(expression, param);
}
静态表达式getWhere表达式(字符串值)
{
var param=Expression.Parameter(typeof(TSource));
var val=表达式常数(值);
var expression=expression.Equal(expression.Constant(1),expression.Constant(1));
foreach(typeof(TSource.GetProperties)(BindingFlags.Public | BindingFlags.Instance)中的var prop)
{
if(prop.PropertyType==typeof(string))
{
expression=expression.OrElse(表达式,
表情,打电话(
表达式.属性(参数,属性),
“包含”,
无效的
瓦尔
)
);
}
}
返回表达式.Lambda(表达式,参数);
}
您仍然可以做得更好,例如,记住type的表达式,以防止每次需要使用不同的搜索文本执行查询时使用反射,等等,但它应该给您一个方向的想法。因为LINQ to Entities和LINQ to SQL都使用表达式作为IQueryable。其中扩展方法参数,您可以在编译类型期间使用反射创建该表达式
,并生成所有表达式,而不是将它们键入源代码中
大概是这样的:
var searchAnyInDB = from Book x in BookDB.Books
where (GetWhereExpression<Book>(_searchdata))
select x;
var searchAnyInDB=来自BookDB.Books中的Book x
其中(getWhere表达式(_searchdata))
选择x;
和GetWhereExpression
方法:
static Expression<Func<TSource, bool>> GetWhereExpression<TSource>(string value)
{
var param = Expression.Parameter(typeof(TSource));
var val = Expression.Constant(value);
var expression = Expression.Equal(Expression.Constant(1), Expression.Constant(1));
foreach(var prop in typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if(prop.PropertyType == typeof(string))
{
expression = Expression.OrElse(expression,
Expression.Call(
Expression.Property(param, prop),
"Contains",
null,
val
)
);
}
}
return Expression.Lambda<Func<TSource, bool>>(expression, param);
}
静态表达式getWhere表达式(字符串值)
{
var param=Expression.Parameter(typeof(TSource));
var val=表达式常数(值);
var expression=expression.Equal(expression.Constant(1),expression.Constant(1));
foreach(typeof(TSource.GetProperties)(BindingFlags.Public | BindingFlags.Instance)中的var prop)
{
if(prop.PropertyType==typeof(string))
{
expression=expression.OrElse(表达式,
表情,打电话(
表达式.属性(参数,属性),
“包含”,
无效的
瓦尔
)
);
}
}
返回表达式.Lambda(表达式,参数);
}
您仍然可以做得更好,例如,记住type的表达式以防止每次需要使用不同的搜索文本执行查询时使用反射,等等。但这应该会让您知道要去哪里。您的意思是您不想指定书名
作者
等等?@I3arnon是的。这就是我想要的mean@AntP-这与代码审查无关(OP希望改进此代码)。我收回了我的投票。乍一看,它可能看起来像是codereview,但我相信它不是它的本质。他想知道一种查询每个属性的方法,这只是一个示例。@DeoWalk:自定义方法在LINQ-to-SQL中不太可能起作用。你的意思是你不想指定BookTitle
Author
等等?@I3arnon是的。这就是我想要的mean@AntP-这与代码审查无关(OP希望改进此代码)。我收回了我的投票。乍一看,它可能看起来像是codereview,但我相信它不是它的本质。他想知道一种查询每个属性的方法,这只是一个示例。@DeoWalk:自定义方法在LINQ-to-SQL中不太可能工作。您能准确地显示代码吗?我还是不明白你的意思。谢谢你能准确地显示代码吗?我还是不明白你的意思。谢谢