0

我有下面的代码,我需要用一个 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 语句之外创建“结果”时,无法将类型“AnonymousType#1”隐式转换为“字符串”。

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

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

4

7 回答 7

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

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

于 2013-01-08T14:30:52.643 回答
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();
于 2013-01-08T14:25:06.243 回答
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
于 2013-01-08T14:37:30.377 回答
0

您根本不需要 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,
};
于 2013-01-08T14:29:44.970 回答
0

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

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

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

于 2013-01-08T14:39:54.013 回答
-1

更改var result = "";

var result = new
{
    LastName = "",
    FirstName = "",
};
于 2013-01-08T14:26:09.787 回答
-2

改变

var result = "";

var result;

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

DetailsModelView
于 2013-01-08T14:40:20.800 回答