【发布时间】:2015-05-22 11:30:37
【问题描述】:
我现在有这个问题,但今天我达到了临界点,我正在寻求您的帮助。
假设我有这个代码:
var query = DbContext.Table.Where(x => x.z == true).Select(x => new { x.a, x.b, x.c });
foreach(var item in query)
{
// Do the work
}
我最终得到了这种匿名类型,一切都很好。现在出现了一些让我对 Where 子句进行条件化的事情,所以我必须根据条件进行不同的查询,这就是我真正感到沮丧的地方:
if(something)
{
var query = DbContext.Table.Where(x => x.z == true && x.zz == false).Select(x => new { x.a, x.b, x.c });
foreach(var item in query)
{
// Do the work
}
}
else
{
var query = DbContext.Table.Where(x => x.z == true).Select(x => new { x.a, x.b, x.c });
foreach(var item in query)
{
// Do the work
}
}
因为foreach循环中要做的工作完全一样,我不应该重复。
所以,我没有使用匿名类型,而是声明了一个新类并尝试了这个:
class MyQuery
{
public int a { get; set; }
public string b { get; set; }
public decimal? c { get; set; }
}
IQueryable<MyQuery> query = null;
if(something)
{
query = (IQueryable<MyQuery>)DbContext.Table.Where(x => x.z == true && x.zz == false).Select(x => new { x.a, x.b, x.c });
}
else
{
query = (IQueryable<MyQuery>)DbContext.Table.Where(x => x.z == true).Select(x => new { x.a, x.b, x.c });
}
foreach(var item in query)
{
// Do the work
}
但是现在我抛出了一个'System.InvalidCastException',因为我仍然得到一个匿名类型,显然它不能被强制转换到我的类中。
为了维护,我想避免重复代码,但我不知道该怎么做。我觉得我在这里缺少一些基本的东西,但找不到什么,所以欢迎和感谢您的帮助。
非常感谢您的帮助。
【问题讨论】:
-
你的第二个代码仍然可以使用匿名类(只需删除演员表)。唯一需要自定义类的情况是当您想要将数据传入或传出方法时。
标签: c# lambda anonymous-types