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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Linq lambda表达式问题_Linq_Entity Framework_Lambda - Fatal编程技术网

Linq lambda表达式问题

Linq lambda表达式问题,linq,entity-framework,lambda,Linq,Entity Framework,Lambda,我是lambda表达式的新手,在尝试找出如何在一个表达式中表示实体框架查询时遇到了问题。我也可能是错的,有更好的方法来做我想做的事。如果这是真的,请让我知道。我的情况是,我有一个高级搜索屏幕,您可以选择搜索bu名称、客户号码或电话号码。如果需要,可以按多个搜索。我使用实体框架作为后端,并为我的表设置了存储库。下面是我试图使用的代码 Func<Parties, bool> exp; exp = null; if (vm.CustomerNumberCriteria != null)

我是lambda表达式的新手,在尝试找出如何在一个表达式中表示实体框架查询时遇到了问题。我也可能是错的,有更好的方法来做我想做的事。如果这是真的,请让我知道。我的情况是,我有一个高级搜索屏幕,您可以选择搜索bu名称、客户号码或电话号码。如果需要,可以按多个搜索。我使用实体框架作为后端,并为我的表设置了存储库。下面是我试图使用的代码

Func<Parties, bool> exp;

exp = null;

if (vm.CustomerNumberCriteria != null)
{
    custID = Convert.ToInt32(vm.CustomerNumberCriteria);
    exp = o => o.ID == custID;
}


if (vm.NameCriteria != null)

    exp += o => o.LastName.Contains(vm.NameCriteria) || o.FirstName.Contains(vm.NameCriteria) || o.MiddleName.Contains(vm.NameCriteria) || o.Designation.Contains(vm.NameCriteria);

if (vm.PhoneNumberCriteria != null)

    exp += o => o.CentralPhoneNumbers.Any(child => child.PhoneNumber == vm.PhoneNumberCriteria);

//TODO set tempresults
tempresults = custs.All.Where(exp).ToList();
Func-exp;
exp=null;
if(vm.customerNumber条件!=null)
{
custID=Convert.ToInt32(vm.customerNumber标准);
exp=o=>o.ID==custID;
}
if(vm.NameCriteria!=null)
exp+=o=>o.LastName.Contains(vm.NameCriteria)| | o.FirstName.Contains(vm.NameCriteria)| | o.MiddleName.Contains(vm.NameCriteria)| o.Designation.Contains(vm.NameCriteria);
if(vm.PhoneNumberCriteria!=null)
exp+=o=>o.CentralPhoneNumbers.Any(child=>child.PhoneNumber==vm.PhoneNumberCriteria);
//TODO设置速度结果
tempresults=custs.All.Where(exp.ToList();
我的问题是,它似乎将此视为一个问题,如果有任何搜索条件匹配,我需要结果


谢谢这里有两个大问题。首先,您使用的是委托,而不是表达式树——这意味着您的整个表将被拉回到客户端并在那里进行过滤。您需要
表达式

现在,如果要建立“或”表达式树,最简单的方法是使用:

var predicate=PredicateBuilder.False();
if(vm.customerNumber条件!=null)
{
custID=Convert.ToInt32(vm.customerNumber标准);
谓词=谓词。或(o=>o.ID==custID);
}
if(vm.NameCriteria!=null)
{
custID=Convert.ToInt32(vm.customerNumber标准);
谓词=谓词。或(o=>o.LastName.Contains(vm.NameCriteria)/*etc*/)
}
if(vm.PhoneNumberCriteria!=null)
{
谓词=谓词。或(o=>o.CentralPhoneNumbers.Any)
(child=>child.PhoneNumber==vm.PhoneNumberCriteria));
}
tempresults=custs.All.Where(谓词).ToList();

这里有两个大问题。首先,您使用的是委托,而不是表达式树——这意味着您的整个表将被拉回到客户端并在那里进行过滤。您需要
表达式

现在,如果要建立“或”表达式树,最简单的方法是使用:

var predicate=PredicateBuilder.False();
if(vm.customerNumber条件!=null)
{
custID=Convert.ToInt32(vm.customerNumber标准);
谓词=谓词。或(o=>o.ID==custID);
}
if(vm.NameCriteria!=null)
{
custID=Convert.ToInt32(vm.customerNumber标准);
谓词=谓词。或(o=>o.LastName.Contains(vm.NameCriteria)/*etc*/)
}
if(vm.PhoneNumberCriteria!=null)
{
谓词=谓词。或(o=>o.CentralPhoneNumbers.Any)
(child=>child.PhoneNumber==vm.PhoneNumberCriteria));
}
tempresults=custs.All.Where(谓词).ToList();

Expression
应该是
Expression
,对吗?@hvd:Yup,打字错误,对不起。修正了。对于任何看这个答案的人来说,你必须下载LinqKit来获得PredicateBuilder。通过Nuget很容易做到。你的解决方案对我很有效。我不得不从你的例子中改变的唯一一件事是我必须说的最后一行。LinqKit,但是我认为SI是因为我的数据来自实体框架。@戴维德:你不必下载“下载”——完整的源代码在我链接到的页面的中间。当然,您可以下载LinqKit,但也可以从页面获取源代码。很高兴它成功了:)
Expression
应该是
Expression
,对吗?@hvd:Yup,typo,抱歉。修正了。对于任何看这个答案的人来说,你必须下载LinqKit来获得PredicateBuilder。通过Nuget很容易做到。你的解决方案对我很有效。我不得不从你的例子中改变的唯一一件事是我必须说的最后一行。LinqKit,但是我认为SI是因为我的数据来自实体框架。@戴维德:你不必下载“下载”——完整的源代码在我链接到的页面的中间。当然,您可以下载LinqKit,但也可以从页面获取源代码。很高兴它奏效了:)
var predicate = PredicateBuilder.False<Parties>();

if (vm.CustomerNumberCriteria != null)
{
    custID = Convert.ToInt32(vm.CustomerNumberCriteria);
    predicate = predicate.Or(o => o.ID == custID);
}

if (vm.NameCriteria != null)
{
    custID = Convert.ToInt32(vm.CustomerNumberCriteria);
    predicate = predicate.Or(o => o.LastName.Contains(vm.NameCriteria) /* etc */)
}

if (vm.PhoneNumberCriteria != null)
{
    predicate = predicate.Or(o => o.CentralPhoneNumbers.Any
                     (child => child.PhoneNumber == vm.PhoneNumberCriteria));
}

tempresults = custs.All.Where(predicate).ToList();