2009-06-18 81 views
2

我不断收到异常有关LINQ到实体不支持这样的certaion查询表达式:LINQ到实体查询怪异

MyDataContext db = new MyDataContext() 
Brand = db.Brands.First(b => b.BrandId == Int32.Parse(brandIdString)) 

我不会试图沿串解析到实体店通过,我只是想将该字符串解析为一个整数用于比较。唯一的办法是事先做好这件事情,还是我完全不在这里?

+0

顺便说一句,这也使得它很难做投影w/EF – 2009-06-18 21:29:50

+0

而且你不能以其他方式做,比如Where(expression).Select(item => item.ToString()),因为它具有无法在查询中表示ToString。 – 2009-06-18 21:37:11

回答

6

你给的例子最好的选择(至少)是拉操作出来的您的LINQ声明:

Int32 brandId = Int32.Parse(brandIdString) 
MyDataContext db = new MyDataContext() 
Brand = db.Brands.First(b => b.BrandId == brandId) 

说明:

当你使用LINQ,它希望找出如何尽可能多的工作来卸载,因为它可以给您的数据库查询。为了做到这一点,它实际上创建了一个表达式树,其中包含您告诉它在各种lambda表达式中执行的所有操作。然后,当你想运行查询时,它会决定什么SQL语句最适合你要求做的事情。这允许它做一些非常花哨的优化。但是,如果它不知道如何将某些东西转换为SQL语句,那么当您尝试运行查询时,它会生气。

-2

是。这很糟糕。我发现你必须对查询之外的数据进行解析或标准化......然后传递结果。我试图在查询范围内做一些日期格式化时遇到了这个问题。我最终将它从查询中移出到一个字符串变量中,然后传递给已经应用了正确格式的变量。

LAME - 实体框架有很长的路要走!

+0

奇怪的是,我说的与接受的答案相同的东西,但最终被拒绝投票! (:P) – 2009-06-21 21:05:22

0

,你可以用这个?

MyDataContext db = new MyDataContext(); 
Brand b = db.Brands.Where(b => b.BrandId == Int32.Parse(brandIdString)).First(); 

的替代解决方案(不使用Lambda表达式......)是这样的:

MyDataContext db = new MyDataContext(); 

Brand b = (from Brand b in db.Brands 
      where b.BrandId == Int32.Parse(brandIdString) 
      select b).First(); 

(此外,你错过了;在每个代码行的末尾,你有没有指定你得到了查询的任何一个变量的名字,但我想那些都是错别字只在这里...)

0

的数据库中不存在服务字符串解析需求。在涉及它之前执行所需的解析。