2013-01-08 125 views
0

我有下面的代码,我需要修改与if语句来说,如果有什么结果这个,或者使它。这里是我现在有:LINQ-不能隐式地将类型'AnonymousType#1'转换为'字符串'

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, 

     }; 

,但我不断收到以下错误:无法隐式转换类型“AnonymousType#1”到“串”时我尝试在LINQ语句之外创建“结果”。

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

这只是一个简单的例子,我的查询在“其他”上变得复杂得多,然后就是ID变化。

+0

请更正代码'ClaimID的=结果。 ClaimID,'你的匿名类型没有属性ClaimID。 –

回答

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语句的两个分支中创建的匿名对象相同。

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

+3

虽然这会起作用,但OP应认真考虑制作一个新的命名类型来代替使用匿名类型,以便使未来开发人员更易于使用,维护和理解。 – Servy

+0

谢谢你们两位。这是从我想要了解和改进的其他人那里传给我的东西。 Servy - 我会尝试采取你的建议(虽然我仍然在学习) –

+1

@Servy:我只是分心编辑我的文章,以评论它看起来像DetailsModelView可以在linq中使用,而不是作为后步骤。编辑回答,以便将其加入。 – Chris

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(); 
+0

这只是一个简单的例子,我的查询在“其他”上变得复杂得多,然后就是ID变化。 –

+0

@TanyaXrum你可以按照这个通用模型来处理所有其他并发症吗?如果你只是在改变你所比较的内容,而不是基本查询,那么答案是适当的。如果它比较复杂,那么发布查询会很有帮助。如果您使用方法语法而不是查询语法,并将条件块中不同的语句和那些不在外部的语句放在一起,那么您也可以避免将整个查询放入条件块中。 – Servy

-1

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

+1

如果我改变它的对象,然后我得到:\t'对象'不包含'LastName'的定义,并且没有扩展方法'LastName'接受类型'对象'的第一个参数可以找到(你是否缺少一个使用指令或程序集引用?)\t在我的底部代码中。确实是 –

+0

。编辑。 – tallseth

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, 
}; 
+0

然后他不会限制从他的数据库返回的列,因为他的原始代码是。 – Servy

+0

@Servy这不是一个目标,并没有指定linq源,所以我猜测。 – asawyer

+0

'ctx'是'context'的常用简写形式,这是许多人倾向于称为ORM的'DataContext'的原因,因此它可能是一种情况。 – Servy

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 
0

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

一个匿名类型在C#的特点是,如果他们包含相同的数据,那么类型会重复使用,以便稍后参考它 - 在这种情况下允许您投射它。

我不确定这是你最好的解决方案,但它应该可以工作。

-2

变化

var result = ""; 

var result; 

确保当你的LINQ语句之外创建它,你将它转换为

DetailsModelView 
+1

不会编译。 var表示基于初始化表达式的类型,如果没有,编译器不知道变量应该是什么类型。 – Servy

相关问题