三元运算符使用LINQ进行故障排除

时间:2011-11-18 05:48:17

标签: c# linq entity-framework linq-to-entities

我在这个三元线上遇到了麻烦:

var userFromContext = IsOwner ? db.Owners.Where(o => o.UserName == username) 
                              : db.Users.Where(u => u.UserName == username);

它给了我这个错误信息:

无法确定条件表达式的类型,因为System.LINQ.IQueryable<Owners>System.LINQ.IQueryable<Users>之间没有隐式转换。

如果我将它分配给var变量,为什么要关心呢?

3 个答案:

答案 0 :(得分:11)

因为变量必须属于某种类型。

var”并不代表“无类型”。这意味着“亲爱的编译器,请根据我指定给它的表达式找出这个变量的类型”。

为了做到这一点,编译器必须首先理解表达式的类型,并且它不能这样做,因为你的三元运算符的两个分支是不同的类型。

答案 1 :(得分:3)

三元运算符必须具有特定的,通用的返回类型。你可以通过将它们都转换为IEnumberable来解决这个问题。

答案 2 :(得分:3)

因为var只是静态类型的占位符。 类型在编译时已知。如果类型取决于数据,则编译器无法知道它是什么类型。如果您真的想使用上述构造,请使用dynamic关键字而不是var:

dynamic userFromContext = IsOwner ? db.Owners.Where(o => o.UserName == username) 
                                  : db.Users.Where(u => u.UserName == username);