在Linq where子句中使用带有字符串的switch-case

时间:2015-02-19 08:32:19

标签: c# sql string linq where-clause

我尝试在LINQ查询中使用where子句。当我使用数值时,它很好,但是当我想比较string值时,它会在where子句中给出错误。

string StartBarcode = (from s in datamodel.Packages
                                    where s.RealBarcode == SelectedBarcode
                                    select s.StartBarcode).FirstOrDefault().ToString();

IQueryable<PageData> q = (from v in datamodel.VW_WaypointDetails
                                          where (v.RealBarcode == null) ? StartBarcode : v.RealBarcode
                                          select new PageData
                                          {
                                              Name = v.Name,
                                              Surname = v.Surname,
                                              Description = v.Description
                                           }

错误是&#39;无法将lambda表达式转换为&#39; string&#39;因为它不是委托类型&#39; (我添加了System.Linq)和无法隐式转换类型&#39;字符串&#39;到&#39; bool&#39; 。 如何将switch-case语句与string值一起使用? 谢谢你的所有答案。

2 个答案:

答案 0 :(得分:4)

当然它会给你一个错误,因为LINQ where子句需要逻辑,结果应该是true或false。

你的逻辑是(v.RealBarcode == null)? StartBarcode:v.RealBarcode ,只返回字符串。

如果我们将你的linq翻译成英语,它听起来像是:

选择条形码

的某些值

听起来应该是这样的:

选择条形码等于

的某些值

我认为你的逻辑看起来应该是这样的

where v.RealBarcode == (v.RealBarcode == null) ? StartBarcode : v.RealBarcode

答案 1 :(得分:4)

where (v.RealBarcode == null) ? StartBarcode : v.RealBarcode

会失败,因为这应该是一个谓词,但你可以这样做:

IQueryAble<PageData> q = datamodel.VW_WaypointDetails.AsEnumerable()
                         .Select(wpd=> new PageData 
                                         {
                                            Name = wpd.Name,
                                            SurName = wpd.Surname,
                                            Description = wpd.Description, 
                                            Barcode = wpd.Barcode == null ? StartBarCode : wpd.Barcode
                                            }).AsQueryAble();

抱歉忘记了对.AsQueryAble()的调用。不确定这是否合情合理,但你可以尝试省去对.AsEnumerable()的调用(实际上是从数据库中获取数据)......我知道Linq to Entities不支持某些功能正常的Linq Scope所以这可能是不可能的,你必须稍后创建实际的对象。