我使用Ria Service域服务进行数据查询。
在我的数据库中,有一个表名为姓,姓的人。然后我使用EF / RIA服务进行数据处理。
然后我创建一个Filter ViewModel来捕获用户输入,根据输入,我构造一个linq Query来访问数据。
在服务器端,人员的默认DomainService查询是:
public IQueryable<Person> GetPerson()
{
return this.Context.Person;
}
在客户端,linq Query for filter就像(我在这里使用Contains函数):
if (!String.IsNullOrEmpty(this.LastName))
q = q.Where(p => (p.LastName.Contains(this.LastName)));
生成的linq查询类似于(在调试时,我得到了它):
MyData.Person[].Where(p => (p.LastName.Contains(value(MyViewModel.PersonFilterVM).LastName) || p.Person.LegalLastName.Contains(value(MyViewModel.PersonFilterVM).LastName)))
当我运行应用程序时,我将“Smith”作为搜索的姓氏,但结果与“Smith”完全无关!
如何解决?
答案 0 :(得分:1)
我在这里猜测你的错误是什么,所以这可能不适合你。
在您的第二个代码段中,您可以执行以下操作。
q = q.Where(p => (p.LastName.Contains(this.LastName)));
这是我认为您的错误所在。在迭代之前,Linq不会评估where子句。尝试将该行更改为以下内容。
qWithData = q.Where(p => (p.LastName.Contains(this.LastName))).ToList();
.ToList()调用将使用数据加载查询。
答案 1 :(得分:0)
当您检入调试器时,value(MyViewModel.PersonFilterVM).LastName
在查询解析时是否评估给Smith?
回想一下,在枚举之前不会解析查询。