gpt4 book ai didi

c# - 根据不同条件创建匿名类型并将其转换为类

转载 作者:太空狗 更新时间:2023-10-29 22:22:15 25 4
gpt4 key购买 nike

这个问题我已经有一段时间了,但今天我达到了临界点,我请求你的帮助。

假设我有这段代码:

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' 抛出,因为我仍然得到一个匿名类型并且显然它不能被转换到我的类中。

为了维护,我想避免重复代码,但我不知道该怎么做。我觉得我在这里缺少一些基本的东西,但找不到什么,所以欢迎和感谢您的帮助。

非常感谢您的帮助。

最佳答案

你把它复杂化了:

IQueryable<MyQuery> query = DbContext.Table;

if (something)
{
query = query.Where(x => x.z == true && x.zz == false)
}
else
{
query = query.Where(x => x.z == true);
}

var result = query.Select(x => new { x.a, x.b, x.c });

foreach (var item in result)
{
// Do the work
}

.Where()方法不会更改查询的“类型”!

请注意这是合法的:

var query = DbContext.Table.Select(x => new { x.a, x.b, x.c });

if (something)
{
query = DbContext.Table.Where(x => x.z == true && x.zz == false).Select(x => new { x.a, x.b, x.c });
}
else
{
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
}

我使用的事实是,C# 编译器“统一”了同一程序集中具有相同参数(相同参数名称、相同类型参数、相同数量参数)的匿名类型。我用这条线 var query = DbContext.Table.Select(x => new { x.a, x.b, x.c });仅将类型“提供”给 var多变的。然后我用其他查询完全覆盖查询,因为各种 .Select(x => new { x.a, x.b, x.c }); “生产”相同(匿名)类型的对象。

关于c# - 根据不同条件创建匿名类型并将其转换为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30395581/

25 4 0
文章推荐: c# - 如何在 C# 中比较两个 list 并只保留没有重复的项目?