LINQ - 无法将类型"匿名类型#1"隐式转换为"字符串"

  • 本文关键字:类型 转换 字符串 LINQ 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,
        };

,但我一直得到以下错误:不能隐式转换类型'AnonymousType#1'到'字符串',当我试图在LINQ语句之外创建"结果"。

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

这只是一个简单的例子,我的查询在"else"上变得复杂得多,而不仅仅是ID的改变。

下面是一个可以工作的函数式程序:

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

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

正如其他人所说,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

这里根本不需要Linq投影。

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

如果FirstOrDefault返回null,你的代码将抛出一个null ref异常。

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

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

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

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

var result = "";更改为

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

change

var result = "";

var result;

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

DetailsModelView

相关内容

  • 没有找到相关文章

最新更新