使用表模型和控制器的MVC模型编码

时间:2017-02-07 14:10:01

标签: c# asp.net-mvc linq

您好我在这里有一些编码问题,我想要做的是基于输入SYSID,从表中查找名称列表,仅用于测试目的。

型号:

public DbSet<firsttest> firsttests { get; set; }

表格

  [Table("FirstTest")]
    public class firsttest
    { 
        public firsttest(){}

        [Column("sysId")]
        public long SysId { get; set; }
        public string Name { get; set; }
    }

控制器:

    [Authorize]
    [Route("api/FirstTest/{SysId}")]
    public List<String> Name(long SYSID)
    {
        using (AContext db = new AContext())
        {
            var query = db.firsttests.Where(a => 1 == 1);
            if (!String.IsNullOrEmpty(SYSID.ToString()))
            {
                query = query.Where(a => a.SysId.Equals(SYSID)).Select(a => a.Name);
            }
            return query.ToList();
        }
    }

错误是:无法将System.Linq.Iqueryable(string)类型隐式转换为System.Linq.Iqueryable(Model.firsttest)

知道如何修改代码吗?

3 个答案:

答案 0 :(得分:1)

试试这个。

[Authorize]
[Route("api/FirstTest/{SysId}")]
public List<String> Name(long SYSID)
{
    using (SpaContext db = new SpaContext())
    {
        var query = db.firsttests.Where(a => 1 == 1);
        if (!String.IsNullOrEmpty(SYSID.ToString()))
        {
            query = query.Where(a => a.SysId.Equals(SYSID));
        }
        return query.Select(a => a.Name).ToList();
    }
}

答案 1 :(得分:1)

您可以在if块中过滤结果,然后在返回List<string>之前进行投影:

if (!String.IsNullOrEmpty(SYSID.ToString()))
{
    query = query.Where(a => a.SysId.Equals(SYSID)); // only filter here
}
return query.Select(a => a.Name).ToList(); // now project the result finally

您看到的这种行为是因为var在C#中的工作方式的本质。

当您编写var query = db.firsttests.Where(a => 1 == 1);时,变量query现在属于IQueryable<Model.firsttest>类型,现在在代码中向下,您无法将变量query分配给不同类型的引用在项目结束后,结果将变为System.Linq.Iqueryable<string>

您可以更详细地了解以下内容:

https://msdn.microsoft.com/en-us/library/bb384061.aspx

What does "var" mean in C#?

答案 2 :(得分:1)

这一行

var query = db.firsttests.Where(a => 1 == 1);

返回firsttest个实体的IQueryable集合。因此,变量query的类型为IQueryable<firsttest>,因为类型推断

但是稍后您在选择IQueryable<string>属性时尝试为该变量设置不同的类型(Name

query = query.Where(a => a.SysId.Equals(SYSID)).Select(a => a.Name);

这就是您收到此编译错误的原因。

字符串null或空检查也没有意义。长值不可为空。因此,您需要有一个有效的数字长值才能使路由正常工作。所以只需在where子句中使用参数。

[Route("api/FirstTest/{SysId}")]
public List<String> Name(long SysId)
{ 
   using (var db = new AContext())
   {
     return db.firsttests   // here the type is IQueryable<firsttest>
              .Where(a => a.SysId.Equals(SysId)) 
              .Select(a => a.Name) // here the type is IQueryable<string>
              .ToList();  // here the type of List<string>
   }
}