我有下面的代码,我需要用一个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