Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于select-from-where LINQ,有没有更短的解决方案?_C#_Linq_Windows Phone - Fatal编程技术网

C# 对于select-from-where LINQ,有没有更短的解决方案?

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) |

我有搜索功能。我想在我的Book表中选择包含
\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中不太可能工作。您能准确地显示代码吗?我还是不明白你的意思。谢谢你能准确地显示代码吗?我还是不明白你的意思。谢谢