在块外部访问隐式类型变量

时间:2014-01-23 11:50:32

标签: c# implicit-declaration

我试图将变量声明为返回匿名类型对象的对象。我得到一个错误(不能隐式地将Anonymous1类型转换为Anonymous2。

var queryResult = new object();

            if (check == 1)
            {
                queryResult = context.SubjectContext
                    .Where(x => x.CreatedBy == CreatedBy)
                    .Select(x => new { x.Id, x.Name });
            }
            else (check == 2)
            {
                queryResult = context.SubjectContext
                    .Where(x => x.CreatedBy == CreatedBy)
                    .Select(x => new { x.Id, x.Name, x.Skillset });
            }


            if (queryResult.Any())
            {
                return jsonRetrunMsg = new JsonReturn { Status = "success", Message = queryResult };
            }
            else
            {
                return jsonErrorMsg = new JsonError { Status = "error", Message = "Check User Id" };
            }

2 个答案:

答案 0 :(得分:1)

我建议你创建一个类,因为它们在字段上有相似之处

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Skillset { get; set; }
}

你的代码就是这样。

object queryResult;

if (check == 1)
{
    queryResult = context.SubjectContext
        .Where(x => x.CreatedBy == CreatedBy)
        .Select(x => new Student() { Id = x.Id, Name = x.Name });
}
else (check == 2)
{
    queryResult = context.SubjectContext
        .Where(x => x.CreatedBy == CreatedBy)
        .Select(x => new Student() { Id = x.Id, Name = x.Name, Skillset = x.Skillset });
}

if (queryResult.Any())
{
    return jsonRetrunMsg = new JsonReturn { Status = "success", Message = queryResult };
}
else
{
    return jsonErrorMsg = new JsonError { Status = "error", Message = "Check User Id" };
}

答案 1 :(得分:1)

虽然您从相同的上下文中选择,在本例中为'SubjectContext',但您在创建新类型时执行此操作:

.Select(x => new { x.Id, x.Name });

和这个;

.Select(x => new { x.Id, x.Name, x.Skillset });

因此,在这种情况下,您必须返回一个隐含类型的变量,称为“var”。像这样:

var queryResult = context.SubjectContext
        .Where(x => x.CreatedBy == CreatedBy)
        .Select(x => new { x.Id, x.Name });

当然,在这种情况下 - 你在括号之间使用它 - 你必须在返回之前更改'queryResult'的声明,并控制结果。像这样:

   if (check == 1)
   {
        var queryResult = context.SubjectContext
            .Where(x => x.CreatedBy == CreatedBy)
            .Select(x => new { x.Id, x.Name });

        if (queryResult.Any())
        {
            return jsonRetrunMsg = new JsonReturn { Status = "success", Message = queryResult };
        }
        else
        {
            return jsonErrorMsg = new JsonError { Status = "error", Message = "Check User Id" };
        }

    } else if (check == 0)
    {
        var queryResult = context.SubjectContext
            .Where(x => x.CreatedBy == CreatedBy)
            .Select(x => new { x.Id, x.Name, x.Skillset });

        if (queryResult.Any())
        {
            return jsonRetrunMsg = new JsonReturn { Status = "success", Message = queryResult };
        }
        else
        {
            return jsonErrorMsg = new JsonError { Status = "error", Message = "Check User Id" };
        }
    }

在这种情况下,var queryResult将采用Linq Query中返回/创建的类型,并且不会出现错误。

好吧,阅读评论后,我为你找到了另一种解决方案,我想它会起作用,只需试一试。

using System.Collections;
object queryResult;
        if (check == 1)
        {
            queryResult = context.SubjectContext
                .Where(x => x.CreatedBy == CreatedBy)
                .Select(x => new { x.Id, x.Name });

        } else if (check == 0)
        {
            queryResult = context.SubjectContext
                .Where(x => x.CreatedBy == CreatedBy)
                .Select(x => new { x.Id, x.Name, x.Skillset });
        }

        if ((queryResult != null) && ((queryResult as ICollection).Count > 0))
        {
            return jsonRetrunMsg = new JsonReturn { Status = "success", Message = queryResult };
        }
        else
        {
            return jsonErrorMsg = new JsonError { Status = "error", Message = "Check User Id" };
        }

猜猜你可以考虑一些东西来避免这么多代码,但是,它现在都可以使用。 胜者。