LINQ - 无法将类型'AnonymousType#1'隐式转换为'string'

时间:2013-01-08 14:22:35

标签: c# linq

我有以下代码,我需要用if语句修改,如果有什么结果,或者做到这一点。这就是我现在所拥有的:

 var result = (from fs in ctx.datFiles
                      where fs.File_ID == fID
                      select new
                      {
                          LastName = fs.datClaim.LastName,
                          FirstName = fs.datClaim.FirstName,
                      }).FirstOrDefault();



    DetailsModelView dmv = new DetailsModelView
    {
        ClaimID = result.ClaimID,
        LastName = result.LastName,
        FirstName = result.FirstName,

    };

我想做类似的事情:

var result =""

if (something)
{
result = (from fs in ctx.datFiles
                          where fs.File_ID == fID
                          select new
                          {
                              LastName = fs.datClaim.LastName,
                              FirstName = fs.datClaim.FirstName,
                          }).FirstOrDefault();

}
else
{
result = (from fs in ctx.datFiles
                          where fs.File_ID == 5
                          select new
                          {
                              LastName = fs.datClaim.LastName,
                              FirstName = fs.datClaim.FirstName,
                          }).FirstOrDefault();
}

        DetailsModelView dmv = new DetailsModelView
        {
            ClaimID = result.ClaimID,
            LastName = result.LastName,
            FirstName = result.FirstName,

        };

但是我不断收到以下错误:当我尝试在LINQ语句之外创建“result”时,无法将类型'AnonymousType#1'隐式转换为'string'。

我需要声明结果以使其工作,而不是字符串?

这只是一个简单的例子,我的查询在“else”上变得更复杂,然后只是ID更改。

7 个答案:

答案 0 :(得分:4)

这是一个有效的功能程序:

var foo = new {LastName = "", FirstName=""};;

int bar = 1;

if (bar==1)
{
    foo = new {LastName = "test1", FirstName="test2"};
}
else
{
    foo = new {LastName = "test3", FirstName="test4"};
}

正如您所看到的,我创建了一个虚拟匿名对象,以便var foo知道要创建的对象。这显然应该是与在if语句的两个分支中创建int相同的匿名对象。

还应该注意,在上面的代码中似乎没有任何理由不直接在linq中使用DetailsModelView而不是匿名类型。可能是您的用例更复杂,但由于存在简单的一对一映射,您可以创建当前创建匿名方法的DetailsModelView。然后可以将结果定义为DetailsModelView

答案 1 :(得分:1)

var result =""结果已经是字符串。

怎么样:

int id;
if(something)
{
    id = fID;
}
else
{
    id = 5;
}

var result = (from fs in ctx.datFiles
                          where fs.File_ID == id
                          select new
                          {
                              LastName = fs.datClaim.LastName,
                              FirstName = fs.datClaim.FirstName,
                          }).FirstOrDefault();

答案 2 :(得分:1)

正如其他人所说,var result = "";string result = "";相同,因此当您尝试将其值设置为linq结果时,会尝试将其转换为字符串。

根据实际代码的设计方式,您可以使用FirstName,LastName属性声明一个简单类型,而不是返回匿名类型。类似地,如果您总是要使用LINQ调用的结果创建DetailsModelView的实例,则可以将结果变量声明为DetailsModelView result = null;,并在代码中返回DetailsModelView而不是匿名类型。最后,您只需要在DetailsViewModel中指定额外的属性(如果有的话),而不是实例化一个新属性。

DetailsViewModel result = null;

if (something)
  result = ;// LINQ Query
else
  result = ;// LINQ Query

答案 3 :(得分:0)

您根本不需要Linq投影。

编辑 - 但正如Servy所指出的,如果这是一个ORM调用,你可能确实需要它,这意味着需要投影。

如果FirstOrDefault返回null,那么你的代码将抛出空引用异常。

int searchId = fId;

if(something)
    searchId = fId;
else
    searchId = 5;

var result = ctx.datFiles.FirstOrDefault(fs => fs.File_ID == searchId)
               .Select(fs=> new 
                 {
                   Id = fs.datClaim.Id,
                   LastName = fs.datClaim.LastName,
                   FirstName = fs.datClaim.FirstName,
                 });

if(result == null)
    throw new Exception(); // if there is no result your code will throw!

DetailsModelView dmv = new DetailsModelView
{
    ClaimID = result.Id,
    LastName = result.LastName,
    FirstName = result.FirstName,
};

答案 4 :(得分:0)

这篇文章告诉你如何转换为匿名类型: http://tomasp.net/blog/cannot-return-anonymous-type-from-method.aspx

C#中匿名类型的一个特性是,如果它们包含相同的数据,那么该类型将被重用,以便您稍后可以引用它 - 在这种情况下允许您转换它。

我不确定这对你来说是最好的解决方案,但它应该可行。

答案 5 :(得分:-1)

var result = "";更改为

var result = new
{
    LastName = "",
    FirstName = "",
};

答案 6 :(得分:-2)

变化

var result = "";

var result;

确保在LINQ语句之外创建它时将其转换为

DetailsModelView
相关问题