您好我在这里有一些编码问题,我想要做的是基于输入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)
知道如何修改代码吗?
答案 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>
。
您可以更详细地了解以下内容:
答案 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>
}
}