[asp.net-mvc]必须初始化隐式类型的局部变量

标签: Asp.net-MVC Linq C#
发布时间: 2017/3/25 10:56:28
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想要动态地把这样的一个条件:-

var data;
if(employeId != 0) {
 data = (from a in ctx.tblTO1
             join b in ctx.tblTO2
                    on a.Company equals b.Company
                    where a.Id == b.Id &&
                    a.employeeId == employeeId
                    select new { a = a, b = b }).ToList();
}else{
     data = (from a in ctx.tblTO1
                 join b in ctx.tblTO2
                        on a.Company equals b.Company
                        where a.Id == b.Id &&
                        a.Cat == cats
                        select new { a = a, b = b }).ToList();
}

上面的结果是表达式的匿名类型。所以我不能将它声明与一号线给出错误。Implicitly typed local variables must be initialised.

为了解决这个问题的方式是什么?我们可以使用一个单独的函数,但随后什么将函数返回类型吗?

解决方法 1:

当然, var data; 没有任何意义。

您可以定义适当的字段的类型,类型的元素。这是特别有用的如果同一类型发生了不止一次。

您也可以使用 ?: ,您在这里使用 if…else :

var data = (employeeId != 0)
  ? (from a in ctx.tblTO1
     join b in ctx.tblTO2
      on a.Company equals b.Company
      where a.Id == b.Id &&
        a.employeeId == employeeId
        select new { a = a, b = b }).ToList()
  : (from a in ctx.tblTO1
     join b in ctx.tblTO2
       on a.Company equals b.Company
       where a.Id == b.Id &&
         a.Cat == cats
         select new { a = a, b = b }).ToList();

但也许最明显的是要修改什么每个案件不同,只是不同的查询︰

var query = from a in ctx.tblTO1
            join b in ctx.tblTO2
            on a.Company equals b.Company
            where a.Id == b.Id
            select new { a = a, b = b };

if (employeeId != 0)
  query = query.Where(i => i.a.employeeId == employeeId);
else
   query = query.Where(i => i.a.Cat == cats);
var data = query.ToList();

这优点在代码中明确这两种情况之间的差异。分离出 ToList() 也有更为明确地说明,如果你修改你的代码一种不再需要它的优势。

赞助商