Bis*_*wal 3 c# linq entity-framework anonymous-types asp.net-mvc-4
我有以下场景:
public JsonResult ChangeFilterList(int option)
{
var data = new[] { new { Text = "Unknown option", Value = -1 } };
switch (option)
{
case 2: data = _departmentnameRepository.All.Select(x => new { Text = x.DeptName, Value = x.Id }).ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray();
break;
default: data = _userRepository.All.Select(x => new { Text = x.DisplayName, Value = x.UserID }).ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
case2并且default看起来很棒但是对案例3(有条件的)抱怨说:Cannot implicitly convert type 'AnonymousType#1[]' to 'AnonymousType#2[]'.不?:应该能够决定类型,因为我已经为匿名提供了蓝图var data = new[] { new { Text = "Unknown option", Value = -1 } };.
解:
@Darin Dimitrov答案很棒,但我希望对匿名类型进行一些测试(简单情况总是需要它).由于犯罪嫌疑人@Douglas:我assetSequenceRepository正提供id的long和匿名的Value推移赞成int不是long.由于C#编译器没有隐式转换long为int,我得到了错误.编译片段是:
public JsonResult ChangeFilterList(int option = 3)
{
var data = new[] { new { Text = "Unknown option", Value = long.MaxValue } };
switch (option)
{
case 2: data = _departmentnameRepository.All.Select(x => new { Text = x.DeptName, Value = (long)x.Id }).ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository.All.Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray()
: _assetSequenceRepository.FindBy(p => p.ProjectId == (int)Session["projectid"]).Select(x => new { Text = x.AssetShotName, Value = x.Id }).ToArray();
break;
default: data = _userRepository.All.Select(x => new { Text = x.DisplayName, Value = (long)x.UserID }).ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)
您正在将编译器置于此处进行实际测试.只需编写一个视图模型来结束其痛苦并使事情更明确:
public class MyViewModel
{
public int Value { get; set; }
public string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后将LINQ查询投影到此视图模型,以避免使用条件运算符和匿名类型可能产生的任何歧义:
public ActionResult ChangeFilterList(int option)
{
var data = new[]
{
new MyViewModel { Text = "Unknown option", Value = -1 }
};
switch (option)
{
case 2: data = _departmentnameRepository
.All
.Select(x => new MyViewModel { Text = x.DeptName, Value = x.Id })
.ToArray();
break;
case 3: data = Session["projectid"] == null
? _assetSequenceRepository
.All
.Select(x => new MyViewModel { Text = x.AssetShotName, Value = x.Id })
.ToArray()
: _assetSequenceRepository
.FindBy(p => p.ProjectId == (int)Session["projectid"])
.Select(x => new MyViewModel { Text = x.AssetShotName, Value = x.Id })
.ToArray();
break;
default: data = _userRepository
.All
.Select(x => new MyViewModel { Text = x.DisplayName, Value = x.UserID })
.ToArray();
break;
}
return Json(data, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)